【问题标题】:How best to initialize python's random module within a function如何最好地在函数中初始化 python 的随机模块
【发布时间】:2019-11-20 06:55:39
【问题描述】:

当随机模块嵌入到这样的函数中时,我正在寻找一些关于生成尽可能随机数的信息:

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() 的能力

每次调用函数时,嵌入在函数中的随机模块是否会使用新种子进行初始化? (而不是使用之前生成的随机数作为种子。)

如果是这样……

考虑到这里for循环中的系统时间会非常接近甚至相同(取决于系统时间的精度),系统时间的默认初始化是否足够精确以提取真正的随机数。 /p>

有没有办法在函数之外初始化一个随机模块并让函数拉下一个随机数(以避免多次初始化。)

还有其他更 Pythonic 的方法来完成这个吗?

非常感谢!

【问题讨论】:

    标签: python random random-seed


    【解决方案1】:

    如果要初始化伪随机数生成器,请使用random.seed()

    你可以看看here

    如果您不使用 random.seed(),内部随机生成器调用种子函数和 使用当前系统当前时间值作为种子值。这就是为什么 每当我们执行 random.random() 时,我们总是得到不同的值

    如果您希望始终拥有一个 diff 编号,那么您不应该费心初始化随机模块,因为在内部,它默认使用的随机模块是当前系统时间(始终是 diff)。 只需使用:

    from random import random 
    
    def coinFlip()
    
        if random() > .5: 
            return "Heads"
        else:
            return "Tails"
    

    为了更清楚,随机模块在每次使用时都不会初始化,仅在导入时进行,所以每次调用 random.random() 时,你都有下一个保证不同的数字

    【讨论】:

    • 我不认为这会起作用(尤其是如果也放入函数中),因为每次运行此脚本时随机数都会生成相同的。此外,如果将 random.seed() 放在函数本身的 rd.random() 之前,则生成的随机数将始终相同。如果我错了,请纠正我。
    • 是的,通常,这就是你可能想要初始化随机模块的原因,以获得相同的“随机数”,如果你不想拥有相同的随机数,那么你不应该初始化随机模块,所以你想总是有差异数字?
    • 正确。 (我将编辑问题以包含该事实。抱歉,我最初没有。)
    • 也许现在,我的回答更适合你的问题
    • 顺便说一下,为了更清楚,随机模块在每次使用时都不会初始化,只在导入时进行,所以每次调用 random.random() 你都有下一个数字这保证是不同的
    【解决方案2】:

    对于初学者:

    该模块为各种分布实现伪随机数生成器。

    [..]

    此模块提供的函数实际上是random.Random 类的隐藏实例的绑定方法。您可以实例化您自己的 Random 实例以获取不共享状态的生成器。

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

    random 模块是一个伪随机数生成器。所有 PRNG 都是完全确定的并且具有 state。这意味着,如果 PRNG 处于相同状态,则下一个“随机”数字将始终相同。如上段所述,您的 rd.random() 调用实际上是对隐式实例化的 Random 对象的调用。

    所以:

    每次调用函数时,嵌入在函数中的随机模块是否使用新种子进行初始化?

    没有。

    有没有办法在函数之外初始化一个随机模块并让函数拉下一个随机数(以避免多次初始化。)

    您不需要避免多次初始化,因为它不会发生。如果您想精确控制状态,可以实例化您自己的 Random 对象。

    class random.Random([seed])
    实现 random 模块使用的默认伪随机数生成器的类。

    random.seed(a=None, version=2)
    初始化随机数生成器。如果省略aNone,则使用当前系统时间。 [..]

    因此,隐式实例化的Random 对象使用系统时间作为初始种子(尽管read further),并从那里保持状态。因此,每次启动 Python 实例时,它都会以不同的方式播种,但只会播种一次。

    【讨论】:

    • 感谢您的详细解答。保持状态是我一直在寻找的关键部分。我将 rusu_ro1 的答案标记为正确,因为正如您在 cmets 中看到的那样,他也启发了我的状态点。非常感谢您在这里的工作和努力!
    猜你喜欢
    • 2021-09-02
    • 2019-11-09
    • 2015-02-28
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多