平方取中法生成偽隨機數序列+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=' ')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM