Skip to content

Instantly share code, notes, and snippets.

@wakwanza
Created April 11, 2015 21:23
Show Gist options
  • Save wakwanza/4f8ca0c834176ee136a4 to your computer and use it in GitHub Desktop.
Save wakwanza/4f8ca0c834176ee136a4 to your computer and use it in GitHub Desktop.
Mersienne Twister with quantum random seed
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