主题:我是新手麻烦哪位前辈能帮我看看这个代码?
草莓的味道
[专家分:0] 发布于 2008-03-14 23:37:00
我们这学期开了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个回复)
沙发
一江秋水 [专家分:9680] 发布于 2008-03-15 07:45:00
把-4.79769313486232e308最后的8改为7即可
板凳
bluefaily [专家分:740] 发布于 2008-03-15 12:54:00
楼上的说的没错,在VB中DOUBLE型的数据负值取值范围为 -1.79769313486231570E+308 到 -4.94065645841246544E-324;正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。所以,呵呵,你超范围了
3 楼
老大徒伤悲 [专家分:29120] 发布于 2008-03-18 14:02:00
我有点看法:
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 楼
草莓的味道 [专家分:0] 发布于 2008-03-19 23:22:00
谢谢你们为我解答!
楼上的前辈:为什么要用两个随机数的和呢?为什么要转换类型?这些问题我都不知道怎么回答...就是因为我们刚开始学所以我还什么都很模糊,就知道这题目要求随机产生整型,长整,单精度和双精度四种类型的数字,然后其他的什么我都摸不着头脑呢...谢谢你这么耐心的为我解答!这题还要求用vartype函数检验,就更难死我了...我都找不到这函数在哪...
5 楼
草莓的味道 [专家分:0] 发布于 2008-03-19 23:37:00
老大,我试了你写的代码,没有达到题目要的结果啊~
我们现在就学到数据类型转换函数这里,所以我觉得老师布置这道题是为了要用到这些函数的吧?再深的我们也还没学啊.....
6 楼
老大徒伤悲 [专家分:29120] 发布于 2008-03-21 14:00:00
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 楼
老大徒伤悲 [专家分:29120] 发布于 2008-03-21 14:08:00
用vartype函数检验?
这样的话,就不能写入标签。
写入标签的东西全都是“字符串”类型
8 楼
草莓的味道 [专家分:0] 发布于 2008-03-21 15:46:00
exp()这个函数是做什么用的?单精度中为什么要用"88.72283892 * Rnd"而不是单精度的最大范围?如果只是在Rnd>0.5时连接负号那是不是意味着出现的正数是偏小的,负数也是偏于更小?有没有办法让它只是随机产生这四种类型的数的方法啊?我觉得老师应该不会让我们初学的人写太复杂的代码吧...
9 楼
草莓的味道 [专家分:0] 发布于 2008-03-21 15:57:00
我知道exp函数是什么了!但后面的问题我还是想不通...
10 楼
草莓的味道 [专家分:0] 发布于 2008-03-21 17:02:00
对了 还有一个问题 为什么要在用了对数函数后再用一个exp函数,这样是实现什么样的功能?我试了去掉对数函数结果就只显示1或-1...麻烦老大再帮我解答一下吧.....弄明白了作业交上去心里才舒坦嘛......谢谢!
我来回复