Xoroshiro128+
[Random Home][Home]
Xoroshiro128+ is one of the fastest Pseudorandom number generators (PRNGs). It was created in 2016 by David Blackman and Sebastiano Vigna and requires two 64-bit unsigned integers as seeds:
|
Outline
The following a sample run:
Seed 1: 74254124354025 Seed 2: 74398021324531 0 0x8732c65698dcL '\xdc\x98V\xc62\x87' 1 0x5f111e6e4815f86L '\x86_\x81\xe4\xe6\x11\xf1\x05' 2 0xc6f92404ee3bbe46L 'F\xbe;\xee\x04$\xf9\xc6' 3 0x4e6fb549d473d685L '\x85\xd6s\xd4I\xb5oN' 4 0xb8d3732bf3fc92ceL '\xce\x92\xfc\xf3+s\xd3\xb8' 5 0x584ddf04552308daL '\xda\x08#U\x04\xdfMX' 6 0x5b25d45d6350e6a8L '\xa8\xe6Pc]\xd4%[' 7 0x9dd6e25a5f4c2964L 'd)L_Z\xe2\xd6\x9d' 8 0x4c3b9cfaff5d8368L 'h\x83]\xff\xfa\x9c;L' 9 0xb49f882106f12258L 'X"\xf1\x06!\x88\x9f\xb4' Coin flip (60) H H H T H H H H H H H H H T T H T H T T H T T H H H T H T T H T H H T H T H T H H T H T H T T H H T T T H H H H H T H T Heads: 36 Tails: 24
In the following code we take the random numbers and then mask of the least significant bit and define it as a "Head" or a "Tail":
import sys val1=54253124354024 val2=5395042653908 if (len(sys.argv)>1): val1=int(sys.argv[1]) if (len(sys.argv)>2): val2=int(sys.argv[2]) def bin2chr(data): result = '' while data: char = data & 0xff result += chr(char) data >>= 8 return result class Xoroshiro128Plus(object): def __init__(self, seed): self.seed = seed @staticmethod def rotl(x, k): return ((x << k) & 0xffffffffffffffff) | (x >> 64 - k) def next(self): s0 = self.seed[0] s1 = self.seed[1] result = (s0 + s1) & 0xffffffffffffffff s1 ^= s0 self.seed[0] = self.rotl(s0, 55) ^ s1 ^ ((s1 << 14) & 0xffffffffffffffff) self.seed[1] = self.rotl(s1, 36) return result print ("Seed 1:\t",val1) print ("Seed 2:\t",val2) print generator = Xoroshiro128Plus([val1, val2]) for i in range(10): val=generator.next() print (i,hex(val),'\t',end='') print (repr(bin2chr(val))) print ('\nCoin flip (60)') generator = Xoroshiro128Plus([val1, val2]) count=0 for i in range(60): val=generator.next() bit = val & 0x1 if (bit==0): count = count+1 print ("H",end='') else: print ("T",end='') print print ('Heads:\t',count) print ('Tails:\t',60-count)