梅森旋轉演算法(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...