平方取中方法是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=' ')