【问题标题】:Random generator in pythonpython中的随机生成器
【发布时间】:2020-09-22 19:44:51
【问题描述】:

我想根据获得 1 的概率和一些初始种子来选择 0 或 1 中的一个。

我尝试了以下操作:

import random

population = [0,1]
random.seed(33)
probabilities = [0.4,0.2,0.5]

def sampleIt():
    selectedProb = random.randrange(0,3,1) #select one of probabilities
    print('Selected Probability: ', selectedProb)
    return random.choices(population, [0, probabilities[selectedProb-1]])

for i in range(100):
    sample = sampleIt()
    print(sample[0])

以下是示例输出:

Selected Probability:  0.2
1
Selected Probability:  0.5
1
Selected Probability:  0.4
1
Selected Probability:  0.2
1
Selected Probability:  0.5
1
Selected Probability:  0.2
1

疑问:

  1. 如您所见,它能够随机选择概率。但是对于每个选定的概率,它最终会从总体中选择 1。如果它选择概率 0.2,那么我希望它选择概率 0.2 的 1。这样,它应该至少选择了一次 0。但这并没有发生。为什么会这样?

  2. seed 设置正确还是我们必须设置不同?

  3. 另外,如果我希望从不同的线程调用 sampleIt(),我需要做哪些更改?

  4. 还有什么标准做法可以提高性能,比如我运行了数百万次吗?我必须使用 numpy 来生成随机数吗?

  5. random.randrange()random.choice() 是否遵循均匀分布?

您可以在线运行代码here

【问题讨论】:

    标签: python-3.x random


    【解决方案1】:

    这里有几个严重错误。让我们谈谈这个,然后是正确的方法。

    首先,如果这工作正常,您将得到 1,净概率为 0.37,即 1/3*(0.2 + 0.4 + 0.5),因为您是随机选择一个概率。

    您在第二个位置参数中将权重传递给random.choices,并且您为选项零传递了权重0,因此它永远不会被选中。在同一个语句中,您不必要地从您拥有的范围中减去 1...

    因此,要为伯努利试验正确执行此操作,您只需绘制一个随机数并将其与您想要的概率进行比较。或者你可以正确使用random.choices,得到一个列表。

    In [14]: def gen_sample(p_success): 
        ...:     if random.random() < p_success: 
        ...:         return 1 
        ...:     return 0 
        ...:                                                                        
    
    In [15]: gen_sample(0.95)                                                       
    Out[15]: 1
    
    In [16]: gen_sample(0.02)                                                       
    Out[16]: 0
    
    In [17]: p_success = 0.85                                                       
    
    In [18]: random.choices([0, 1], weights=[1-p_success, p_success], k=10)         
    Out[18]: [1, 1, 1, 1, 1, 1, 1, 0, 1, 1]
    

    【讨论】:

    • 切中要害...啊,我在weights 上犯了错误,非常感谢您提供的另一种方法
    • 对什么会更有效率有任何评论吗? if 接近还是choices 接近?
    • 还有一个疑问。假设我想为不同目的生成随机数。说一个用于task1,另一个用于task2,另一个用于task3。我应该创建三个不同的random.Random() 实例,以便在这些任务中进行适当的均匀分布吗? (我可能需要从这三个任务的不同范围生成,比如 task1 需要[0,1] 中的随机数、[0,1,2,3,4] 中的 task2 和[0,1,2,3,4,5,6] 中的 task3)。
    • 关于 if/choices...这取决于您计划如何使用这些数字。什么都有道理。您不需要多个随机实例。只需使用一个并根据每个需要正确制定choices 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多