平方取中法生成伪随机数序列+python实现

平方取中方法是1946年由John Von Neumann,S. Ulm和N. Metropolis 在Los Alamos实验室研究中子碰撞时提出的,他们当时的研究工作是曼哈顿项目的一部分。他们的平方取中法如下:

1. 从一个4位数x0开始,称为种子.

2. 将它平方得到一个8位数(必要时在前面加0).

3. 取中间的4位数作为下一个随机数.

按上述方式进行就能得到一个数列,它是从0到9999随机出现的整数,这些整数可以换算到任何从a到b的区间,例如,若想要从0到1的数,只需用10 000除这些4位数。

例如:

取一个种子,比如x0 = 2041,将它平方(前面加0)得到04165681,中间的4位数1656就是下一个随机数。用这个方法生成的9个随机数是

n

0

1

2

3

4

5

6

7

8

9

10

11

12

xn

2041

1656

7423

1009

0180

0324

1049

1004

80

64

40

16

2

如果愿意的话,可以采用多于4位的数字,但是总要取中间的、与种子数字数目相同的那个数字作为下一个随机数。如设x0=653217(6位数字),它的平方426 692 449 089有12位数字,取中间的6位数为692 449.

平方取中方法是有道理的,但是它的一个主要缺点是它会退化为0(并永远停在这里)。

python实现代码:

 1 import numpy as np
 2 
 3 #创建一个列表来存储随机数
 4 randomlist = []
 5 
 6 #设置一个四位数的随机数
 7 seed = np.random.randint(1000,10000)
 8 
 9 #将种子作为第一个随机数
10 randomlist.append(seed)
11 
12 while(len(randomlist) <= 10000):
13 
14     #计算随机数的平方
15     seedsquare = seed ** 2
16 
17     #获取随机数平方的长度,如果长度不是8,前面用0补齐
18     seedsquare_str = str(seedsquare)
19     if len(seedsquare_str) != 8:
20         seedsquare_str = seedsquare_str.rjust(8,'0')
21 
22     #获取该随机数平方的中间四位
23     seedsquare_4 = seedsquare_str[2:6]
24 
25     #将取出的随机数平方的中间四位作为随机数加入随机数列表
26     randomlist.append(seedsquare_4)
27 
28     #将取出的随机数平方的中间四位作为新的种子
29     seed = int(seedsquare_4)
30     continue
31 
32 for randint in randomlist:
33     print(randint,end=' ')
原文地址:https://www.cnblogs.com/hanyu1995/p/14658844.html