使⽤python实现伪随机数⽣成器
在前两天学习了使⽤python实现伪随机数的⽅法,今天是时候来做⼀个总结了。
python生成1到100之间随机数⾸先要说明的是什么是随机数,真正的随机数是使⽤物理现象产⽣的:⽐如掷钱币、骰⼦、转轮、使⽤电⼦元件的噪⾳、核裂变等等。产⽣这些随机数的⽅法有很多种,⽽这些产⽣随机数的⽅法就称为随机数⽣成器。像前⾯说的由物理现象所产⽣的随机数发⽣器叫做物理性随机数发⽣器,它们的缺点是技术要求⽐较⾼。
但是在我们的实际⽣活中⼴泛应⽤的是伪随机数⽣成器,所谓的“伪”就是假的的意思,也就是说并不是真正的随机数。那么这些随机数是怎么实现的呢?这些数字是由固定的算法实现的,是有规律可循的,并不能实现真正的“随机”,但是它们具有类似于随机数的统计特征。这样的发⽣器叫做伪随机数发⽣器。
实现伪随机数的⽅法有很多种,如:平⽅取中法,线性同余法等⽅法。
下⾯主要介绍的是线性同余法,如C的rand函数和JAVA的java.util.Random类就是使⽤该⽅法实现的,其公式为:
<
rNew = (a*rOld + b) % (end-start)
其中, a称为乘数,b称为增量,(end-start)称为模数,它们均为常数。
然后设置rOld = rNew,⼀般要求⽤户指定种⼦数rOld(也称为seed),当然也可以⾃由选择a和b,但是两个数如果选择不好,可能会影响数字的随机性 ,所以⼀般令:
a=32310901
b=1729
这样使得⽣成的随机数最均匀。下⾯我是⽤的将种⼦⾃定义设为999999999。代码如下:
def myrandint(  start,end,seed=999999999  ):
a=32310901    #产⽣出的随机数最均匀
b=1729
rOld=seed
m=end-start
while True:      #每调⽤⼀次这个myrandint函数,才⽣成⼀次随机数所以要惰性求值
rNew = (a*rOld+b)%m
yield rNew
rOld=rNew
#模拟使⽤20个不同的种⼦来⽣成随机数
for i in range(20):
r = myrandint(1,10000,  i)
#每个种⼦⽣成10个随机数
print('种⼦',i,'⽣成随机数')
for j in range(10):
print( next(r),end=',' )
print(      )
运⾏结果是使⽤20个不同的种⼦⽣成的随机数。
但是,这样将种⼦设为固定值是不合理的。
r = myrandint(1,10000,2)
print(r.__next__())
print(r.__next__())
运⾏结果为:
9993
6934
当再次运⾏代码:
r = myrandint(1,10000,2)
print(r.__next__())
运⾏结果仍然是:9993
这便不能体现随机,因此常采⽤系统时间作为种⼦来实现该算法。以上代码只需将seed设为系统时间便可以实现。