Created
April 11, 2015 21:23
-
-
Save wakwanza/4f8ca0c834176ee136a4 to your computer and use it in GitHub Desktop.
Mersienne Twister with quantum random seed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from __future__ import absolute_import | |
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
from itertools import repeat | |
from math import fmod | |
import quantumrandom | |
try: | |
range = xrange | |
except NameError: | |
pass | |
LENGTH_G = 32 | |
class mtQ(object): | |
""" | |
""" | |
MT = [] | |
index = 0 | |
mask_a = 0 | |
mask_b = 0 | |
mask_c = 0 | |
def __init__(self, length_g=LENGTH_G): | |
self.MT = self.MT + list(repeat(0, 624)) | |
self.mask_a = (1 << length_g) - 1 | |
self.mask_b = (1 << length_g - 1) | |
self.mask_c = (1 << length_g - 1) - 1 | |
@property | |
def get_quantum_seed(self): | |
return str(int(quantumrandom.hex()[:19], 16)) | |
def init_generator(self): | |
self.MT[0] = self.get_quantum_seed | |
self.MT = [((1812433253 * self.MT[x-1]) ^ ((self.MT[x-1] >> 30) + x)) & self.mask_a for x in range(1, 624)] | |
def nums_generator(self): | |
for i in range(624): | |
y = (self.MT[i] & self.mask_b) + (self.MT[(i + 1) % 624] & self.mask_c) | |
self.MT[i] = self.MT[(i + 397) % 624] ^ (y >> 1) | |
if y % 2 != 0: | |
self.MT[i] ^= 2567483615 | |
def nums_extract(self): | |
if self.index == 0: | |
self.nums_generator() | |
y = self.MT[self.index] | |
y ^= y >> 11 | |
y ^= (y << 7) & 2636928640 | |
y ^= (y << 15) & 4022730752 | |
y ^= y >> 18 | |
self.index = fmod(self.index + 1, 624) | |
return y | |
def run(self): | |
self.init_generator() | |
return self.nums_extract() | |
if __name__ == '__main__': | |
x = mtQ() | |
x.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment