Skip to content

Instantly share code, notes, and snippets.

@ph4r05
Last active November 26, 2018 11:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ph4r05/5df1c7374ed6153bff8b878e9df23c7d to your computer and use it in GitHub Desktop.
Save ph4r05/5df1c7374ed6153bff8b878e9df23c7d to your computer and use it in GitHub Desktop.
class mt19937(object):
# https://github.com/james727/MTP/
def __init__(self, seed = 0):
self.state = [0]*624
self.f = 1812433253
self.m = 397
self.u = 11
self.s = 7
self.b = 0x9D2C5680
self.t = 15
self.c = 0xEFC60000
self.l = 18
self.index = 624
self.lower_mask = (1<<31)-1
self.upper_mask = 1<<31
# update state
self.state[0] = seed
for i in range(1,624):
self.state[i] = self.int_32(self.f*(self.state[i-1]^(self.state[i-1]>>30)) + i)
def twist(self):
for i in range(624):
temp = self.int_32((self.state[i]&self.upper_mask)+(self.state[(i+1)%624]&self.lower_mask))
temp_shift = temp>>1
if temp%2 != 0:
temp_shift = temp_shift^0x9908b0df
self.state[i] = self.state[(i+self.m)%624]^temp_shift
self.index = 0
def get_random_number(self):
if self.index >= 624:
self.twist()
y = self.state[self.index]
y = y^(y>>self.u)
y = y^((y<<self.s)&self.b)
y = y^((y<<self.t)&self.c)
y = y^(y>>self.l)
self.index+=1
return self.int_32(y)
def int_32(self, number):
return int(0xFFFFFFFF & number)
# Usage:
mt = mt19937(0)
print(mt.get_random_number())
# Demo: https://repl.it/@DusanKlinec/MersenneTwisterPython?language=python3
"""
// Equivalent to: https://repl.it/@DusanKlinec/MersenneTwisterCpp
#include <iostream>
#include <random>
int main() {
std::mt19937 mt;
mt.seed(0);
std::cout << mt();
}
OR python:
$> pip install randomgen
from randomgen import MT19937
rg = MT19937(0).generator
rg.random_raw()
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment