簡體   English   中英

如何在Python中生成足夠多的隨機數

[英]How to generate multiple random numbers in Python to a sufficiently 'random' degree

我希望這個問題是足夠值得質疑的,並且我不會錯過這一點。 我了解可能會有多個答案-我會標記我正確的最佳答案,但是如果這不是一個好問題,請說出來,我會視情況刪除。

如果我使用的是需要大量(不止一個)隨機數的python腳本,例如

from random import randrange

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

print number1, number2, number3

...那么蘭德蘭奇是最好的方法嗎? 具體來說,它到底有多隨機? 我覺得我注意到它有點...偏見?

好像,反復獲得相同的值。

我可能在想像。

但是很明顯,我知道計算機的隨機性能不好(根本),我想知道這個模塊的種子是如何播種的……

有沒有更好的方法來生成我的隨機數? 像“更隨機”的模塊,還是給它“更隨機”的種子的方法?

最好使用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

這在很大程度上取決於您要尋找的隨機程度。 Python為os.urandom提供了加密用途; 但這是從/ dev / urandom讀取的,而不是從/ dev / random讀取的,因此對於某些極端情況,它可能不夠隨機( 有關unix和linux堆棧交換的討論 )。 秘密模塊是為更明確的選擇而開發的,而隨機模塊顯然是偽隨機的。 只要不重復種子,那么偽隨機數就足夠了(這樣做對可重復測試或重新生成相同的過程生成的游戲很有幫助,這就是為什么我們要有getstate和setstate的原因)。

通常,我們發現隨機性模式的能力遠遠超過了我們識別隨機性的能力。

我對隨機或偽隨機的差異了解不多,但是如果您運行同一randrange命令1000萬次,您會發現重復的百分比非常接近。 因此,我認為您僅通過打印生成的數字並查看它們就可以發現任何非隨機行為(至少在這種情況下不行)。

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)

暫無
暫無

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

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