2004年11月9日星期二

关于伪随机数

按照Knuth(中文名高纳德,这个老头挺可爱的)的建议,一致分布的伪随机数(PRNG)按照下面的函数来确定:
In+1 = a*In+ c (mod m)
取适当的a ,c m,可以让产生的数看上去是随机的,而且周期很大。第一个In,即I0是随机数的种子。通常一个库函数在使用这个方法(或者这个方法的变种)产生随机数实要求用户提供一个种子(seed)。如果没有提供,会使用当前的时间。

要注意的是,伪随机数并不真的是随机的,因为第n+1个数和第n个数是相关的。这样,如果你要产生很多组随机数序列,就很有可能产生完全相同的序列。

我的chord的仿真程序里面,随机关键字的产生就遇到了这个问题。后面改正了这个错误。不过任何时候使用伪随机数,都要记住伪随机数的产生原理,这样出现问题时,才可以知道原因。伪随机数的产生还有很多别的办法,但是,Knuth建议的这个方法使用最广,很多程序库里面缺省都用这个方法来产生一致分布的伪 随机数。

没有评论: