2017-08-17 67 views
0

我希望這個問題具有足夠的問題值得關注,並且我沒有錯過這一點。我知道有可能有多個答案 - 我會標記出我得到的最好答案,但如果這不是一個好問題,那麼請說,我會酌情刪除。如何在Python中生成多個隨機數到足夠的「隨機」程度

如果我使用的是需要大量(多於一個)隨機數的Python腳本,例如

from random import randrange 

number1 = randrange(10) 
number2 = randrange(10) 
number3 = randrange(10) 

print number1, number2, number3 

...那麼是randrange最好的辦法嗎?具體來說,它究竟是多麼隨意?我覺得我發現它有一種......偏見?

就像,反覆似乎得到相同的價值觀。

我可能會想象它。

但很明顯,我知道電腦不做隨機井(所有),我想知道這個模塊怎麼連種子或任何...

是否有更好的方法來生成我的隨機數?就像一個「更隨機」的模塊或一種給它「更隨機」種子的方式?

+5

重複獲得相同的值是隨機性所固有的。如果你從來沒有得到相同的價值觀,那麼這就是偏見。如果你擲出一個六面死一千次,並且從未連續得到兩個六面體,那麼就是操縱了它。 – Kevin

+0

Chekc這個信息,是隨機使用,也許對你有幫助:https://docs.python.org/3/library/random.html# –

+0

你應該看看產生的數字,然後進行卡方檢驗他們。 –

回答

1

更好使用SystemRandom以獲得更好的不可預測性。 randrange是一個僞隨機數發生器,它使用Mersenne Twister

from random import SystemRandom 

srand = SystemRandom() 

num1 = srand.choice(range(10)) 
num2 = srand.choice(range(10)) 
num3 = srand.choice(range(10)) 

print num1, num2, num3 
+0

謝謝!所有好的評論和我看到,我已經做的幾乎肯定是好的,但由於你的答案提供了一個更不可預測的替代方案,我會去那! –

1

這很大程度上取決於您要查找的隨機程度。 Python爲os.urandom提供了密碼使用的意圖;但是從/ dev/urandom讀取,而不是/ dev/random,因此對於某些極端情況(discussion on unix & linux stack exchange)可能不夠隨機。 secrets模塊是爲了更清晰的選擇而開發的,而random模塊顯然是僞隨機的。如果種子不重複(這樣做對重複測試或重新生成相同的程序生成的遊戲等是有幫助的,這就是爲什麼我們獲得狀態和設置狀態),那麼僞隨機性通常就足夠了。

一般來說,我們查找隨機模式的能力遠遠超出了我們識別隨機性的能力。

+0

感謝您的評論 - 特別是最後一個! –

1

我對隨機或僞隨機的差異瞭解不多,但如果您運行1000萬次相同的randrange命令,則可以看到重複的百分比非常接近。所以我不認爲你可以通過打印生成的數字並查看它們(至少不是這種情況)來發現任何非隨機行爲。

from random import randrange 
number_of_repeats = [0,0,0,0,0,0,0,0,0,0] 
percentage = {} 
loop_count = 10000000 
for _ in range(loop_count): 
    number_of_repeats[randrange(10)]+=1 
for num,i in enumerate(number_of_repeats): 
    percentage[num] = (i/loop_count)*100 
print(percentage) 
+0

很好地說明了! –