簡體   English   中英

如何最好地在 function 中初始化 python 的隨機模塊

[英]How best to initialize python's random module within a function

當隨機模塊嵌入到 function 中時,我正在尋找一些關於生成盡可能隨機數的信息,如下所示:

import random as rd

def coinFlip()
    flip = rd.random()

    if flip > .5: 
        return "Heads"
    else:
        return "Tails"

main()
    for i in range(1000000):
        print(coinFlip())

編輯:理想情況下,上述腳本總是會產生不同的結果,因此限制了我使用 random.seed() 的能力

每次調用 function 時,嵌入在 function 中的隨機模塊是否使用新種子進行初始化? (而不是使用之前生成的隨機數作為種子。)

如果是這樣...

考慮到此處 for 循環中的系統時間非常接近甚至可能相同(取決於系統時間的精度),系統時間的默認初始化是否足夠精確以提取真正的隨機數。

有沒有辦法在 function 之外初始化一個隨機模塊並讓 function 拉下一個隨機數(以避免多次初始化。)

還有其他更多的pythonic方法來完成這個嗎?

非常感謝!

如果要初始化偽隨機數生成器,請使用random.seed()

你可以看看這里

如果不使用 random.seed() 初始化偽隨機數生成器,內部隨機生成器調用種子 function 並使用當前系統當前時間值作為種子值。 這就是為什么每當我們執行 random.random() 我們總是得到不同的值

如果您希望始終擁有一個 diff 編號,那么您不應該費心初始化隨機模塊,因為在內部,它默認使用的隨機模塊是當前系統時間(始終是 diff)。 只需使用:

from random import random 

def coinFlip()

    if random() > .5: 
        return "Heads"
    else:
        return "Tails"

更清楚地說,隨機模塊在每次使用時都不會初始化,僅在導入時進行,所以每次調用 random.random() 時,你都有下一個保證不同的數字

對於初學者:

該模塊為各種分布實現偽隨機數生成器。

[..]

該模塊提供的函數實際上是random.Random class 的隱藏實例的綁定方法。 您可以實例化您自己的Random實例以獲取不共享 state 的生成器。

https://docs.python.org/3/library/random.html

random模塊是一個Pseudo-Random Number Generator 所有 PRNG 都是完全確定的,並且具有state 這意味着,如果 PRNG 位於相同的 state 中,則下一個“隨機”數字將始終相同。 如上段所述,您的rd.random()調用實際上是對隱式實例化的Random object 的調用。

所以:

每次調用 function 時,嵌入在 function 中的隨機模塊是否使用新種子進行初始化?

不。

有沒有辦法在 function 之外初始化一個隨機模塊並讓 function 拉下一個隨機數(以避免多次初始化。)

您不需要避免多次初始化,因為它沒有發生。 如果您想精確控制 state,您可以實例化您自己的Random object。

class random.Random([seed])
Class 實現了隨機模塊使用的默認偽隨機數生成器。

random.seed(a=None, version=2)
初始化隨機數生成器。 如果省略aNone ,則使用當前系統時間。 [..]

因此,隱式實例化的Random object 使用系統時間作為初始種子(盡管請進一步閱讀),並且從那里將保留 state。 因此,每次您啟動 Python 實例時,都會以不同的方式播種,但只會播種一次。

暫無
暫無

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

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