梅森旋轉演算法(Mersenne Twister)

2022-08-27 19:33:08 字數 1399 閱讀 4496

梅森旋轉演算法(mersenne  twister)也稱馬特賽特旋轉演算法。在python中的random模組就採用該演算法計算隨機數。

梅森旋轉演算法mersenne twister)是乙個偽隨機數發生演算法。由松本真和西村拓士在2023年開發,基於有限二進位製字段上的矩陣線性遞迴。可以快速產生高質量的偽隨機數,修正了古典隨機數發生演算法的很多缺陷。

最為廣泛使用mersenne twister的一種變體是mt19937,可以產生32位整數序列。具有以下的優點:

週期非常長,達到2−1。儘管如此長的週期並不必然意味著高質量的偽隨機數,但短週期(比如許多舊版本軟體包提供的2)確實會帶來許多問題。

在1 ≤k≤ 623的維度之間都可以均等分布(參見定義)。

除了在統計學意義上的不正確的隨機數生成器以外,在所有偽隨機數生成器法中是最快的(當時)

整個演算法主要分為三個階段:

第一階段:獲得基礎的梅森旋轉鏈;

第二階段:對於旋轉鏈進行旋轉演算法;

第三階段:對於旋轉演算法所得的結果進行處理;

演算法實現的過程中,引數的選取取決於梅森素數,故此得名。

python**實現:

def

_int32(x):

return int(0xffffffff &x)

class

mt19937:

def__init__

(self, seed):

self.mt = [0] * 624self.mt[0] =seed

for i in range(1, 624):

self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) +i)

defextract_number(self):

self.twist()

y =self.mt[0]

y = y ^ y >> 11y = y ^ y << 7 & 2636928640y = y ^ y << 15 & 4022730752y = y ^ y >> 18

return

_int32(y)

deftwist(self):

for i in range(0, 624):

y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff))

self.mt[i] = y ^ self.mt[(i + 397) % 624] >> 1

if y % 2 !=0:

self.mt[i] = self.mt[i] ^ 0x9908b0df

執行mt19937(seed=).extract_number()執行結果。

2 4演算法 列舉 梅森數

形如2n 1的素數稱為梅森數 mersenne number 例如2 2 2 3 1 7都是梅森數。1722年,雙目失明的瑞士數學大師尤拉證明了2 31 1 2147483647是乙個素數,堪稱當時世界上 已知最大素數 的乙個記錄。本題要求編寫程式,對任一正整數n n 20 輸出所有不超過2 n 1...

python求梅森尼數 梅森尼數

問題描述 法國數學家梅森尼對這類形如2 n 1的素數特別感興趣,做過很多有意義的工作,後人把此類數命名為梅森尼數。已經證明了,如果2 n 1是素數,則冪指數n必須是素數,然而,反過來並不對,當n是素數時,2 n 1不一定是素數。例如,人們已經找出2 11 1是乙個合數,23可以除盡它,2 23 1是...

梅森素數彙總

第9個梅森素數 當p 61時,m 61 2 61 1,位數為19位,由pervushin發現於公元1883年。第10個梅森素數 當p 89時,m 89 2 89 1,位數為27位,由powers發現於公元1911年。第11個梅森素數 當p 107時,m 107 2 107 1,位數為33位,由pow...