51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 6943|回复: 12
打印 上一主题 下一主题

[原创] Randomize函数的用法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-8-28 12:53:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Rnd用来生成随机数,Randomize用来初始化Rnd函数的随机数生成器,赋给它新种子。
我用起来的时候有点晕:
rnd [(number)] number 为负数时使用number为种子生成随机数
是不是这样理解的:

  1. Randomize 10
  2. rnd
复制代码

Randomize 将10赋给rnd作为种子生成随机序列

Randomize的作用范围是第一次调用Rnd函数之前么?
我在一个for循环里面使用了它:

  1. For  j=0 to 5
  2.         Randomize 10
  3.         msgbox rnd
  4. Next
复制代码

结果是生成了如下数列:
0.5749933
0.4921337
0.2718709
0.6670802
0.4814524
0.3039149

而这样使用的话:

  1. For  j=0 to 5
  2.         rnd -1
  3.         Randomize 10
  4.         msgbox rnd
  5. Next
复制代码

结果是:
重复序列0.1436949


帮助文档里面Randomize有这么一句话:
使用相同的 number 值的 Randomize 不能重复先前的随机数序列。
就是说,使用相同的Randomize [number]去初始化Rnd函数,但得不到相同的序列

但RND函数里面说的是,所以对于任何最初给定的种子都会生成相同的数列。
就上面这句话的理解,
我以为的rnd函数应该是这样的:
rnd1=funtion(number)
rnd2=funtion(rnd1)
...

上面说的有点乱了.
我的问题应该是这样的:
Randomize number
是把number作为Rnd函数的种子么?
Randomize函数在rnd函数已经被调用之后使用,如:
Dim i
i=rnd;
Randomize number '(或者不带参数)
这个时候,Randomize还起作用么?如果起作用的话,是把number赋给rnd函数作为种子去生成下一个随机数么?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-8-28 15:02:33 | 只看该作者
好复杂,楼主研究的比较深入
我一般调用随机函数用我自己写的这个函数,比较方便
'随机函数生成
'输入值:生成值范围 i~j
'返回值:随机数
Public Function Get_RandNum(fromNum,toNum)
        If (fromNum<0) Or (toNum<0) Then
                MsgBox "只接受大于零的输入"
        ElseIf fromNum>toNum then
                MsgBox "起始值必须小于结束值"
        Else
                Dim RunTime
                Randomize   
                RunTime = Int((10 * Rnd) + 1)
                Dim MyValue,i
                For i = 1 To RunTime
                        Randomize  
                        MyValue = Int(((toNum - fromNum + 1) * Rnd) + (fromNum))
                Next
           Get_randNum=MyValue
          End If
End Function
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2007-8-28 15:10:57 | 只看该作者
hao  nan  o
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2007-8-28 18:44:50 | 只看该作者
原帖由 yuandjing 于 2007-8-28 15:02 发表
好复杂,楼主研究的比较深入
我一般调用随机函数用我自己写的这个函数,比较方便
'随机函数生成
'输入值:生成值范围 i~j
'返回值:随机数
Public Function Get_RandNum(fromNum,toNum)
        If (fromNum

呵呵,我想问一下,您的函数里面的for循环体,也使用了randomize函数,这是用来干嘛呢?
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2007-8-28 19:38:29 | 只看该作者
QTP有自带的随机函数了,何必再去用的那么复杂呢。。。直接用RandomNumber(i,j)不是很好么。。。直接就返回了一个从i到j的随机整数。。。
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-8-28 19:55:43 | 只看该作者
Randomize 的作用就是初始化随机函数,一般情况下不用带参数就好,它会自动调用SystemTimer做为参数,从而每次循环都生成不同随机数序列。其参数的值可以理解为生成随机数列的编号。
例如:运行以下代码
Randomize 10
For  j=0 to 5
        msgbox rnd
Next
结果是生成了如下数列:
0.5749933
0.4921337
0.2718709
0.6670802
0.4814524
0.3039149

然后将Randomize的参数改为5
Randomize 5
For  j=0 to 5
        msgbox rnd
Next
得到另一组完全不同的随机数列
0.2565482
0.0215489
0.9685989
0.6594774
0.2659847

但若再把Randomize的参数改回到10,那么又将输出第一次产生的随机数列
即运行:
Randomize 10
For  j=0 to 5
        msgbox rnd
Next
得到结果:
0.5749933
0.4921337
0.2718709
0.6670802
0.4814524
0.3039149
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    7#
    发表于 2007-8-28 23:12:50 | 只看该作者
    呵呵!都研究地很深呀,学习了。谢谢各位!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    8#
    发表于 2007-8-28 23:15:23 | 只看该作者
    关于此函数,也可以参考 http://bbs.51testing.com/viewthread.php?tid=29637
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2007-8-29 08:45:21 | 只看该作者
    因为发现随机函数不够随机,所以这样做的目的是为了生成更随机的随机数
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
     楼主| 发表于 2007-8-29 08:48:33 | 只看该作者
    哈哈,刚刚又试了3组测试,结果如下:
    Dim i
    Randomize 10
    For i = 1 to 5
            msgbox rnd
    Next
    0.5749933
    0.2375866
    0.5295308
    0.2520258
    0.9770579
    ========================
    Dim i
    For i = 1 to 5
            Randomize 10
            msgbox rnd
    Next
    0.5749933
    0.4921337
    0.2718709
    0.6670802
    0.4814524
    =========================
    Dim i
      Randomize 10
    For i = 1 to 5
            msgbox rnd
    Next
    Randomize 10
    For i = 1 to 5
            msgbox rnd
    Next
    0.5749933
    0.2375866
    0.5295308
    0.2520258
    0.9770579
    0.3039149
    0.3014932
    0.2732968
    0.1517703
    0.07219708

    Dim i
      Randomize 10
    For i = 1 to 5
            msgbox rnd
    Next
    For i = 1 to 5
            Randomize 10
            msgbox rnd
    Next
    0.5749933
    0.2375866
    0.5295308
    0.2520258
    0.9770579
    0.3039149
    0.5709482
    0.7698483
    0.4387271
    0.4320909

    到现在为止,我觉得基本弄清楚这2个函数的作用了:
    rnd [number1]函数是随机数生成器,randomize[number2]函数可以初始化rnd函数;
    rnd函数的随机序列有2个参数决定:一个是parameter1,一个是parameter2.这2个参数,在首次运行的时候都有一个默认值,但在rnd函数的运行过程中,parameter1的值是变化的,变化的规则由首次运行时number1的值决定(小于0时每次都取number1,其它情况取随机序列中的数),parameter2的值是固定的,由randomize函数给出。如果没有给出,则使用默认值。rnd函数的结果由parameter1,2的值共同决定。所以,每次rnd函数运行时,如果没有使用randomize函数对他进行初始化的话,产生的随机序列是一样的。
    欢迎大家去验证,哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
     楼主| 发表于 2007-8-29 08:53:57 | 只看该作者
    原帖由 yuandjing 于 2007-8-29 08:45 发表
    因为发现随机函数不够随机,所以这样做的目的是为了生成更随机的随机数

    我只是想弄明白这2个函数的工作机理到底是什么。如果目的仅仅是生成随机序列的话,调用rnd函数前用无参数randomize去初始化就可以了,因为用的是系统时间参数,总是在变化的,哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
    发表于 2007-8-29 10:57:47 | 只看该作者
    也在学习~~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2007-8-29 11:13:12 | 只看该作者
    原帖由 Banditu 于 2007-8-29 08:48 发表
    哈哈,刚刚又试了3组测试,结果如下:
    Dim i
    Randomize 10
    For i = 1 to 5
            msgbox rnd
    Next
    0.5749933
    0.2375866
    0.5295308
    0.2520258
    0.9770579
    ========================
    Dim i
    For i = 1 to 5 ...

    够强,向你致敬,学习了
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-8 18:30 , Processed in 0.076120 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表