Python 3中线性同余发生器如何影响随机数生成器的伪随机数周期?
- 内容介绍
- 文章标签
- 相关推荐
本文共计482个文字,预计阅读时间需要2分钟。
pythonimport random
x=[str(random.randint(0, 5)) for i in range(10)]x_str=''.join(x)y=[str(random.randint(0, 5)) for i in range(100000000)]y_str=''.join(y)
if x_str in y_str: print(共有多少个:) print(y_str.count(x_str)) print(第一个出现的位置:)
import randomx=[str(random.randint(0, 5)) for i in range(10)]
x_str=''.join(x)
y=[str(random.randint(0, 5)) for i in range(100000000)]
y_str=''.join(y)
if x_str in y_str:
print("共有多少:")
print(y_str.count(x_str))
print('第一个出现位置')
print(y_str.find(x_str))
else:
print("没有")
如上面代码所示, 突然想起来编程语言中的随机数产生是采用线性同余发生器产生的,那么既然是尾随机数它必然有重复的时候,那么我们有没有可能找到它重复的时候,或者发行一个周期呢,所以由此写了上面的代码。
注: 该代码比较吃内存没有16G 内存的电脑可能是跑不了上面的代码的。
一共跑了两次, 结果如下图:
首先并没有发现什么周期可言,估计这个笨方法是发现不了的,前提是它真的有周期;
其次, 我们发现及时是5以内的整数, 产生的序列出现重复的时候都是要1000万个数生成以后才会出现重复的序列;
最后,我们知道伪随机数是会出现重复的,但是我们能遇到的可能性不大,理论上存在,实践中可以不考虑。
附加:
如果随机数的产生设置为 100以内的整数, 跑了N多次也没有发现重复的序列。 即修改上面代码:
random.randint(0, 5) 为random.randint(0, 100)由此可以发现伪随机数其实还是比较靠谱的。
本文共计482个文字,预计阅读时间需要2分钟。
pythonimport random
x=[str(random.randint(0, 5)) for i in range(10)]x_str=''.join(x)y=[str(random.randint(0, 5)) for i in range(100000000)]y_str=''.join(y)
if x_str in y_str: print(共有多少个:) print(y_str.count(x_str)) print(第一个出现的位置:)
import randomx=[str(random.randint(0, 5)) for i in range(10)]
x_str=''.join(x)
y=[str(random.randint(0, 5)) for i in range(100000000)]
y_str=''.join(y)
if x_str in y_str:
print("共有多少:")
print(y_str.count(x_str))
print('第一个出现位置')
print(y_str.find(x_str))
else:
print("没有")
如上面代码所示, 突然想起来编程语言中的随机数产生是采用线性同余发生器产生的,那么既然是尾随机数它必然有重复的时候,那么我们有没有可能找到它重复的时候,或者发行一个周期呢,所以由此写了上面的代码。
注: 该代码比较吃内存没有16G 内存的电脑可能是跑不了上面的代码的。
一共跑了两次, 结果如下图:
首先并没有发现什么周期可言,估计这个笨方法是发现不了的,前提是它真的有周期;
其次, 我们发现及时是5以内的整数, 产生的序列出现重复的时候都是要1000万个数生成以后才会出现重复的序列;
最后,我们知道伪随机数是会出现重复的,但是我们能遇到的可能性不大,理论上存在,实践中可以不考虑。
附加:
如果随机数的产生设置为 100以内的整数, 跑了N多次也没有发现重复的序列。 即修改上面代码:
random.randint(0, 5) 为random.randint(0, 100)由此可以发现伪随机数其实还是比较靠谱的。

