回 帖 发 新 帖 刷新版面

主题:我是新手麻烦哪位前辈能帮我看看这个代码?

我们这学期开了VB,刚上了3节课,结果做作业就遇到不懂的,麻烦各位前辈能给我讲讲~先谢谢了!
我们这道题是要随机产生整型,长整,单精度和双精度四种类型的数字,我用了数据类型转换函数,也不知道对不对,我是这么写的
Private Sub Command1_Click()
  Randomize
  Label1.Caption = CInt(-32768 * Rnd + 32767 * Rnd)
  Label2.Caption = CLng(-2147483648# * Rnd + 2147483647 * Rnd)
  Label3.Caption = CSng(-3.402823E+38 * Rnd + 3.402823E+38 * Rnd)
  Label4.Caption = CDbl(-4.79769313486232e308 * Rnd + 4.94065615841247e-324 * Rnd)
End Sub
Label4这句显示有溢出,我也不知道该怎么改,这种菜鸟问题希望大家别嫌麻烦回答我一下!非常感谢![em8]

回复列表 (共13个回复)

沙发

把-4.79769313486232e308最后的8改为7即可

板凳

楼上的说的没错,在VB中DOUBLE型的数据负值取值范围为 -1.79769313486231570E+308 到 -4.94065645841246544E-324;正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。所以,呵呵,你超范围了

3 楼

我有点看法:
1、先说说你的程序:
Private Sub Command1_Click()
  Randomize                     这行没有问题。
  Label1.Caption = CInt(-32768 * Rnd + 32767 * Rnd)
                                这行,为什么要用两个随机数的和呢?以下问题同。为什么要转换类型?
  Label2.Caption = CLng(-2147483648# * Rnd + 2147483647 * Rnd)
  Label3.Caption = CSng(-3.402823E+38 * Rnd + 3.402823E+38 * Rnd)
                                这行,产生的随机数分布不是很好。主要在于大多时候都希望指数均布。下行同。
  Label4.Caption = CDbl(-4.79769313486232e308 * Rnd + 4.94065615841247e-324 * Rnd)
                                这行,4.94065615841247e-324 * Rnd基本就被完全忽略了,没有任何价值。
End Sub

2、所以我建议
   a、整数、长整数,简单使用范围乘随机数;符号另行产生。
   b、单精度、双精度数,采用指数法产生。

3、代码如下:
Private Sub Command1_Click()
  Randomize
  Label1=32767# * Rnd
  if rnd〉0.5 then label1="-" & label1
  Label2=2147483647 * Rnd
  if rnd>0.5 then label2="-" & label2
  Label3=exp(88.72283892*rnd)
  if rnd>0.5 then label3="-" & label3
  Label4=exp(ln(4.94065615841247e324)*rnd)
  if rnd>0.5 then label4="-" & label4
End Sub

4 楼

谢谢你们为我解答!
楼上的前辈:为什么要用两个随机数的和呢?为什么要转换类型?这些问题我都不知道怎么回答...就是因为我们刚开始学所以我还什么都很模糊,就知道这题目要求随机产生整型,长整,单精度和双精度四种类型的数字,然后其他的什么我都摸不着头脑呢...谢谢你这么耐心的为我解答!这题还要求用vartype函数检验,就更难死我了...我都找不到这函数在哪...

5 楼

老大,我试了你写的代码,没有达到题目要的结果啊~
我们现在就学到数据类型转换函数这里,所以我觉得老师布置这道题是为了要用到这些函数的吧?再深的我们也还没学啊.....

6 楼

Private Sub Command1_Click()
  Randomize
  Label1 = Int(32767 * Rnd)
  If Rnd() > 0.5 Then Label1 = "-" & Label1
  Label2 = CLng(2147483647 * Rnd)
  If Rnd > 0.5 Then Label2 = "-" & Label2
  Label3 = Exp(88.72283892 * Rnd)
  If Rnd > 0.5 Then Label3 = "-" & Label3
  Label4 = Exp(Log(1.79769313486231E+308) * Rnd)
  If Rnd > 0.5 Then Label4 = "-" & Label4
End Sub

这是正确的,我调试过了。
原来的错误在于
1、第四行的大于号是错误的输入
2、第九行自然对数应写作log
3、4.94065615841247e324溢出
4、第三行、第五行没有转换数据类型。

7 楼

用vartype函数检验?
这样的话,就不能写入标签。
写入标签的东西全都是“字符串”类型

8 楼

exp()这个函数是做什么用的?单精度中为什么要用"88.72283892 * Rnd"而不是单精度的最大范围?如果只是在Rnd>0.5时连接负号那是不是意味着出现的正数是偏小的,负数也是偏于更小?有没有办法让它只是随机产生这四种类型的数的方法啊?我觉得老师应该不会让我们初学的人写太复杂的代码吧...

9 楼

我知道exp函数是什么了!但后面的问题我还是想不通...

10 楼

对了 还有一个问题 为什么要在用了对数函数后再用一个exp函数,这样是实现什么样的功能?我试了去掉对数函数结果就只显示1或-1...麻烦老大再帮我解答一下吧.....弄明白了作业交上去心里才舒坦嘛......谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册