2016-02-28 18 views
1

我試圖使用park-miller算法生成隨機數。我知道一般的想法應該是:Park Miller算法(python 3)

seed = (16807*seed) % (2147483947) 

但我不知道我將如何實際實現這個到python。我將如何指定從0-9返回一個數字?

回答

0

使用一臺發電機,那麼模操作的,因爲你知道值在0-2147483947然後用一個簡單的線性方程y=a*x+b值映射到新範圍

def park_miller(seed,start,end): 
    a = (end-start)/2147483947 
    b = start 
    while True: 
     seed = (16807*seed) % 2147483947 
     yield a * seed +b 

這裏一些測試

>>> rand=park_miller(8,0,1) 
>>> next(rand) 
6.261094532875687e-05 
>>> next(rand) 
0.05230215814041659 
>>> next(rand) 
0.04237186598163661 
>>> next(rand) 
0.14395155336637308 
>>> next(rand) 
0.39375742863236407 
>>> 
>>> rand=park_miller(8,0,10) 
>>> next(rand) 
0.0006261094532875686 
>>> next(rand) 
0.5230215814041659 
>>> next(rand) 
0.42371865981636603 
>>> next(rand) 
1.4395155336637309 
>>> next(rand) 
3.9375742863236405 
>>> next(rand) 
8.811030241428854 
>>> next(rand) 
6.985267694762423 
>>> next(rand) 
1.394145872048281 
>>> 
>>> rand=park_miller(42,0,10) 
>>> [next(rand) for _ in range(20)] 
[0.0032870746297597353, 5.245863302371871, 7.224522964035922, 
2.5574565517345866, 3.1722650031991133, 6.257908767501488, 
6.672655397502722, 7.319265828253476, 4.9007754561808605, 
7.333092031723578, 7.277777178187214, 7.601033792500801, 
0.5749505609691992, 3.1940782093306144, 2.8724642196359103, 
7.506139420747902, 5.685244510002383, 1.9044796100634134, 
8.588806335789574, 2.0680856153566394] 
>>>