【问题标题】:How can I perform multiple random.choices tests如何执行多个 random.choices 测试
【发布时间】:2022-11-29 09:58:58
【问题描述】:

我有一个名为 marbles 的列表,包含 10.000 个项目(5000 个蓝色和 5000 个红色)

我想做一个测试。要从列表中随机选择 4 个项目,我会这样做

import random

marbles = ["RED" for _ in range(5000)] + ["BLUE" for _ in range(5000)]
A = random.choices(marbles, k=4) 
print(A) # this will print a list of 4 random Items from the list

我需要做的是执行此测试 100 次并打印结果。 我想避免创建 100 个不同的变量然后将它们全部打印出来。 我可以做些什么来优化和避免超过 100 行代码。对于循环?我将不胜感激任何意见。先感谢您

我的清单似乎没有任何问题。

【问题讨论】:

  • 是的,for 循环。
  • 热烈欢迎来到 SO。请尽量使用正确的大写字母,例如在你的标题、句子或“我”这个词的开头。这对你的读者来说是温和的。请阅读How to askMinimal Reproducible Example。然后用代码更新您的问题,向我们展示您到目前为止所做的尝试。

标签: python loops random


【解决方案1】:

使用 for 循环。

for x in range(4):
    print(random.choice(marbles))

【讨论】:

    【解决方案2】:

    有无放回的抽样

    了解有放回抽样和无放回抽样之间的区别很重要。假设我们有一袋 1 颗蓝色和 2 颗红色弹珠,您选择了 2 颗弹珠。如果您在拉出第一个弹珠后将弹珠放回原位,则可能会得到 2 个蓝色弹珠。这叫做抽样替代品。使用random.choice是采样替代品。

    random.choices() 和 random.sample()

    您可以使用 random 模块中的 choices() 函数提取多个元素。例如,从一袋 1 个红色和 2 个蓝色弹珠中抽取 4 个弹珠替代品:

    >>> import random
    >>> marbles = ['red'] * 1 + ['blue'] * 2
    >>> random.choices(marbles, k=4)
    ['red', 'blue', 'blue', 'blue']
    

    您可以使用采样没有使用 sample 函数使用 random 模块进行替换:

    >>> random.sample(marbles, 4)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/opt/homebrew/Cellar/python@3.10/3.10.8/Frameworks/Python.framework/Versions/3.10/lib/python3.10/random.py", line 482, in sample
        raise ValueError("Sample larger than population or is negative")
    ValueError: Sample larger than population or is negative
    

    正如预期的那样,这给出了一个错误。你不能从一袋 3 颗弹珠中取出 4 颗弹珠。现在如果我们在袋子里放 1000 颗红色弹珠和 2000 颗蓝色弹珠,我们会得到:

    >>> marbles = ['red'] * 1000 + ['blue'] * 2000
    >>> random.sample(marbles, 4)
    ['blue', 'blue', 'blue', 'red']
    

    内存使用和权重

    上面示例的一个可能问题是,如果弹珠较多,则需要大量内存。因此,choice()函数有一个weights参数。你可以像这样使用它:

    >>> marbles = ['red', 'blue']
    >>> weights = [1000, 2000]
    >>> random.choices(marbles, weights=weights, k=4)
    ['blue', 'blue', 'blue', 'red']
    

    遗憾的是,random 模块没有使用权重进行不替换采样的功能。

    使用 for 循环重复采样

    最后,我们需要计算结果。一种更高级的方法是使用字典和 collections 模块中的 defaultdict。作为替代方案,我们将创建一个结果列表,并使用该列表的一组循环遍历不同的结果。

    随机导入

    样本大小 = 4 重复采样 = 100

    outcomes = []
    marbles = ['red'] * 5000 + ['blue'] * 5000
    
    for i in range(REPEAT_SAMPLING):
        outcome = ', '.join(random.sample(marbles, SAMPLE_SIZE))
        outcomes.append(outcome)
    
    for outcome in set(outcomes):
        print(f'{outcome} appeared {outcomes.count(outcome)} times out of {REPEAT_SAMPLING}')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      相关资源
      最近更新 更多