micropython-samples/random/cheap_rand.py

39 wiersze
966 B
Python

# pseudorandom numbers for MicroPython. ISR friendly version.
# Probably poor quality numbers but useful in test scripts
# Based on xorshift32 here https://en.wikipedia.org/wiki/Xorshift
# Author: Peter Hinch
# Copyright Peter Hinch 2020 Released under the MIT license
# Example usage to produce numbers between 0 and 99
# rand = cheap_rand(100)
# successive calls to rand() will produce the required result.
def cheap_rand(modulo, seed=0x3fba2):
x = seed
def func():
nonlocal x
x ^= (x & 0x1ffff) << 13;
x ^= x >> 17;
x ^= (x & 0x1ffffff) << 5;
return x % modulo
return func
# The sum total of my statistical testing
#import pyb, micropython, time
#rand = cheap_rand(1000)
#sum = 0
#cnt = 0
#def avg(n):
#global sum, cnt
#sum += n
#cnt += 1
#def cb(t):
#n = rand()
#micropython.schedule(avg, n)
#t = pyb.Timer(1, freq=20, callback=cb)
#while True:
#time.sleep(1)
#print(sum/cnt)