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