python 如何执行多个随机选择测试

3htmauhk  于 2023-01-01  发布在  Python
关注(0)|答案(2)|浏览(116)

我有一个列表叫大理石。大理石= 10.000项(5000蓝色和5000红色)
我想执行一个测试,其中“def A1.primo():“将计算并返回在较小样本中比在较大样本中重复更多的测量随机事件。使用(k=4,k=7)

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

如何优化代码,然后将从A1.primo返回的数字保存到csv.文件中

j9per5c4

j9per5c41#

使用for循环。

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

6jygbczu2#

更换和未更换的取样

理解替换取样和不替换取样的区别是很重要的。假设我们有一袋1个蓝色和2个红色的弹珠,你选择了2个弹珠。如果你在拉出第一个弹珠后把弹珠放回去,就有可能得到2个蓝色弹珠。这叫做 * 替换取样。使用random.choice就是 * 替换取样。

随机选择()和随机样本()

您可以使用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模块没有使用权重进行无替换采样的功能。

使用循环重复采样

最后,我们需要计算结果。一个更高级的方法是使用字典和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}')

相关问题