Is there a Python library that can produce random data as fast as os.urandom, but the data can be reproduced if given a seed?
1 Answer
You can use random.seed to produce a reproducible sequence. The only problem is getting Python to produce random bytes quickly. You can use a trick observed by @jfs with random.getrandbits to reduce the amount of processing Python has to do:
import random def almost_urandom(n): return random.getrandbits(8 * n).to_bytes(n, 'big') random.seed lets you deterministically generate the bytes:
In [26]: random.seed(0) In [27]: almost_urandom(10) Out[27]: b'\xc2\tb\x9fo\xbe\xd8,\x07\xcd' In [28]: almost_urandom(10) Out[28]: b'\n]k\xaa\x94U\xe3\xe7\x06\x82' In [29]: random.seed(0) In [30]: almost_urandom(10) Out[30]: b'\xc2\tb\x9fo\xbe\xd8,\x07\xcd' In [31]: almost_urandom(10) Out[31]: b'\n]k\xaa\x94U\xe3\xe7\x06\x82' It runs an order of magnitude faster than os.urandom() for me, even for n in the millions.
os.urandomdoes and pseudo-random generators do, right?pv < /dev/urandom > /dev/nullvary significantly between systems. Mine cluster around ~13MiB/s, with one producing ~180MiB/s. These aren't particularly fast rates. What are you going to be using this random data for?