编程论坛
注册
登录
编程论坛
→
VB6论坛
随机原理
THE老王
发布于 2020-04-24 20:12, 1888 次点击
众所周知,Rnd是一个伪随机函数,可是它的内部原理是什么?它是怎样取数的?
4 回复
#2
时光流逝
2020-04-25 13:18
Rnd是根据系统内部时钟的值来取伪随机数的
#3
wmf2014
2020-04-25 14:05
所谓伪随机,就是结果可以预料的一个数据系列。目前常用的方法是线性同余函数产生,这个系列是固定的,所以在不做特殊设定的情况下,你每次运行程序取得的随机数据不会变化,和系统时间无关。为了让伪随机像真随机,随机函数引入种子概念,种子可以形象地理解为从第几个数开始读取这个系列的数据,这时可以把系统时间引入做种子,因为你每次运行程序的时间不一样,所以每次得到不同的随机数,就像真随机了。你也可以不引入时间,比如你可以把第一次按键或鼠标移动的路径作为种子,就更像随机数了
你也可以用别的方法产生随机数,比如你可以无限制地把圆周率运算下去,按10位数据的读取顺序读取下去,这样你也可以的到一个伪随机数据系列,你也可以引入种子概念,不是每次从31415926开始读,如果种子为1,就从14159265、35897932、3846264、3383279...这样取,是不是非常像随机数?
#4
ZHRXJR
2020-04-25 18:05
Rnd 函数按微软官方的解释应该是:产生一系列大于0小于1的随机数,标准的格式是 Rnd(0),其中 0 是种子,默认的 Rnd 的种子就是 0,因此 Rnd 与 RND(0) 是一样的。
它不是按照系统时间产生不同的随机数,运行 Rnd 在不同的时间可能产生的随机数可能是一样的。伴随 Rnd 函数还有一个函数 Randomize 函数是初始化随机数生成器,有了这个函数 Rnd 在生成随机数是按照系统时间给定种子而产生不同的随机数,一般来说,二个函数结合使用,产生的随机数重复的概率将比较小。
例如:
Randomize
NN = Int( Rnd * 9 + 1)
生成1 到 10 之间的随机数,重复率就非常小。如果不使用 Randomize 函数,那么重复的几率将非常大,甚至可能生成一系列系统相同的随机数。
#5
THE老王
2020-04-28 21:18
我已经找到了一种很好的随即方法,模拟人脑的随机系统。它对一系列时间、鼠标和键盘操作进行检测和保存成Integer。取数时用rnd取数并用rnd选择计算方式(+,-,*,/,Mod,^,And,Not,Or,Xor,Eqv,Imp)并进行多次计算后生成随机数,这样的随机性应当会大大增加并不容易被破译
1