#!/usr/bin/env pypy3 # pylint: disable=superfluous-parens # superfluous-parens: Parentheses are good for clarity and portability """Rapidly generates psuedo-random numbers between 0 and 2^64-1.""" import os import signal import sys import time VALUE = 0 def random(): # pylint: disable=global-statement # global-statement: We need something with a global lifetime """Return a random number.""" global VALUE # define M (((WIDE_TYPE)1) << 64) # define A ((WIDE_TYPE)18136136422342313421ULL) # define C ((WIDE_TYPE)1ULL) coeff_a = 18136136422342313421 coeff_c = 1 coeff_m = 2**64 VALUE = (coeff_a * VALUE + coeff_c) % coeff_m return VALUE def usage(retval): """Output a usage message.""" sys.stderr.write("Usage: %s --bytes n --seed s\n" % sys.argv[0]) sys.exit(retval) def sigpipe_handler(signum, frame): """Exit on SIGPIPE.""" del signum del frame sys.exit(0) def gen_blocks(number_of_bytes, blocksize): """Generate a series of random blocks.""" list_ = [] for _dummy in range(0, number_of_bytes, 8): value = random() for bitno in range(0, 64, 8): sampled_value = (value >> bitno) & 0xFF list_.append(sampled_value) if list_[blocksize:]: yield list_ list_ = [] if list_: yield list_ def main(): """Start the ball rolling.""" signal.signal(signal.SIGPIPE, sigpipe_handler) seed = -1 global VALUE number_of_bytes = 1 while sys.argv[1:]: if sys.argv[1] == "--bytes": number_of_bytes = int(sys.argv[2]) del sys.argv[1] elif sys.argv[1] == "--seed": seed = int(sys.argv[2]) del sys.argv[1] elif sys.argv[1] in ("--help", "-h"): usage(0) else: sys.stderr.write("Illegal argument: %s\n" % sys.argv[1]) usage(1) del sys.argv[1] all_good = True if (number_of_bytes // 8) * 8 != number_of_bytes: print(f"{sys.argv[0]}: --bytes must be a multiple of 8", file=sys.stderr) all_good = False if not all_good: print(f"{sys.argv[0]}: One or more items in preflight check failed\n", file=sys.stderr) sys.exit(1) blocksize = 2**18 if seed >= 0: VALUE = seed else: VALUE = int(time.time()) for block in gen_blocks(number_of_bytes, blocksize): os.write(1, bytes(block)) if __name__ == "__main__": main()