回 帖 发 新 帖 刷新版面

主题:谁能谈谈随机函数RND()的使用?

比如求10到99之间的随机整数,能列举出多少种方法?

回复列表 (共14个回复)

11 楼

不错。学习了。听说basic中的rnd是伪随机数,不是太明白。谁能介绍下rnd()函数的原理。还有rnd(n)中n这个参数怎么设置,还有随即种子randomize有什么含义。

12 楼

如果不使用参数,可以得到一串随机数:
rnd,rnd,rnd,rnd,rnd   '四个数值不等
使用参数,也可以得到一串随机数,相当一串常数数组,其值是不会改变的
rnd(0),rnd(1),rnd(2),rnd(3),rnd(4)

当randomize后面的值相同时,得到的随机数列是相同的,
所以我们在需要极大程度的随机数的时候,通常会拿timer来作randomize的参数。
测试一下:
for i=1 to 5
    randomize 9
    print rnd,rnd,rnd,rnd
next
print
for i=1 to 3
    randomize 9
    for j=1 to 2
        print rnd(0),rnd(1),rnd(2),rnd(3)
    next
next
print
for i=1 to 5
    randomize timer
    print rnd,rnd,rnd,rnd
next

13 楼

timer是不断变化的,所以相当于种子也不断化,于是每次得到的随机数序列就不同了

14 楼

[quote]不错。学习了。听说basic中的rnd是伪随机数,不是太明白。谁能介绍下rnd()函数的原理。还有rnd(n)中n这个参数怎么设置,还有随即种子randomize有什么含义。[/quote]


不仅是C语言,PASCAL都是伪随机数。具体原理我不太知道,不过猜测应该内部有个数学公式,比如N/4(当然实际的要复杂得多,只是举个例子)。现在有个随机数种子,例如是10,代进函数就是10/4=2。5, 然后将得到的结果再作为种子代入函数得2。5/4=0.625,再代入0.625/4=0.15625。。。如此反复。通过这个你也会发现,其实每次得到的整个随机数序列都是一样的--即种子一定的情况下,产生的结果是一样的,也就是结果是可预测的,这就是所谓的“伪随机”。据说在电脑上除了得用放射源之类的物理随机产生器,是无法得到真正的随机数的。这是由它的产生原理决定的。randomize可以指定一个种子,如果randomize timer句式就是用计时器来作种子,time记录的是自0时以来流逝的时间,是不断变化中的,所以每次得到的随机数序列就是不一样的。其实这只是timer代替我们用不同数值来替换种子而已。某一刻,比如timer=6818.23的时候,产生的随机数序列仍然是固定的,可预测的。不过它有个好处,在你编制打字软件的时候,重新换屏显示新的单词或字母的时候,可以更随机一点,这样就不会让打字练习者能摸透软件的规律,从而使测试的结果不那么准确。游戏中的应用也是一样的,让游戏者摸不清炸弹或老鼠从哪个位置出来,会大大增加游戏的乐趣。

我来回复

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