簡體   English   中英

如何在python中制作自定義的rand函數

[英]how to make your customised rand function in python

我想做一個隨機數發生器

所以我做了很多研究,並在下面做了一小段代碼

a=1
b=2
m=5000
x=3
lst=[]
for i in range(10):
  x=(a*x+b)%m
  lst.append(x)
print(lst)
if len(lst) != len(set(lst)):
    print("it has duplicates but possibly random numbers")
else:
    print("those were random numbers")

我從這里得到的數學方程式為我提供了一些隨機數,但是只有當值較大時,如果我選擇了較小的值(假設m = 5,其余的值保持不變),我可以看到形成了重復的數字序列。

* 題*

我可以從這里看到python是從OS中獲取的,它不會生成它們,所以這是在python中生成隨機數的正確方法嗎?

我只介紹 加密安全的偽隨機數生成器

PRNG是一種返回明顯隨機(偽隨機)數的函數,足以欺騙人類。 有一個模式 ,這只是一個硬模式(對我們而言)

例如:

以下序列非常簡單(我想說,如果它是由PRNG生成的,那是一個非常糟糕的PRNG)

[0,2,4,6,8]

現在,我想說其他序列是由更好的PRNG生成的

[1、5、5、2、6、0、3]

因此,我們需要一個函數,該函數生成具有(人類)硬模式的序列,並且每個數字都取決於先前的數字。

一個好的方法可能是使用一堆邏輯和算術運算(例如XOR,Division,OR,減法,模數)

我完全按照上面的描述編寫了此函數,對我來說,結果非常令人滿意。

n = 0xDEADBEEF
#returns a pseudorandom number between 0-9
def random():
    global n
    n = (n * 63) % 0xC4CB7296
    n = n ^ 0x1754FBF
    n = (n*0xFF) % 4294967296
    n = n ^ 0x222F42CB
    n = n | 0x1234567890
    n = ((n + 14351514) * 32) % 7777333
    return n % 10

for i in range(6):
    print(random())

#Outputs:
2
4
7
2
6
9

如果您不總是想要相同的結果,則可以使用種子:

def seed(s):
    global n
    n = s


seed(12345)

for i in range(6):
    print(random())

#Outputs
9
1
5
8
5
9

您的隨機性是最正確的。 問題出在您的范圍生成器上:

一般混合同余生成器的周期最多為m,對於某些因子選擇,其周期遠小於m。

因此,如果您的m=5范圍不應超過5。

另外,請注意:

混合同余生成器將在以下情況下為所有種子值提供完整周期:

m和偏移量c是相對質數,
a-1可被m所有素因子整除,
如果m被4整除,則a-1被4整除。

資料來源:您提供的Wiki文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM