用替换从瓮中绘制 2 个数字 - Python

Posted

技术标签:

【中文标题】用替换从瓮中绘制 2 个数字 - Python【英文标题】:Draw 2 numbers from urn with replacement - Python 【发布时间】:2021-07-04 01:56:00 【问题描述】:

我的骨灰盒包含数字 1.3 和 0.9,我想每次模拟绘制 35 次替换。然后执行最终计算,将结果附加到列表中。 我总共想进行 10000 次模拟。

我的代码如下所示:

#Draw either 1.3 or 0.9
returns = [1.3,0.9]

#No. of simulations
simulations = 10000

#10000 for loops
for i in range(simulations):
    lst = []

    #each iteration should include 35 random draws with replacement
    for i in range(35):
        lst.append(random.choices(returns,1))
        
    lst = np.array(lst)

#Do final calculation and append solution to list
ret = []
ret.append((prod(lst)^(1/35))-1)

我收到的错误是TypeError: 'int' object is not iterable。我明白为什么它不起作用,因为我正在尝试将整数转换为列表对象......但我只是不知道如何解决这个问题?

完整的堆栈跟踪:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-5d61655781f6> in <module>
      9     #each iteration should include 35 random draws with replacement
     10     for i in range(35):
---> 11         lst.append(random.choices(returns,1))
     12 
     13     lst = np.array(lst)

~/opt/anaconda3/lib/python3.7/random.py in choices(self, population, weights, cum_weights, k)
    355                 total = len(population)
    356                 return [population[_int(random() * total)] for i in range(k)]
--> 357             cum_weights = list(_itertools.accumulate(weights))
    358         elif weights is not None:
    359             raise TypeError('Cannot specify both weights and cumulative weights')

TypeError: 'int' object is not iterable

【问题讨论】:

请提供完整的堆栈跟踪 【参考方案1】:

如果要将 lst 转换为 numpy 数组,则可以改用 numpy.random.choice。这也将消除对 for 循环的需要。

import numpy as np
#Draw either 1.3 or 0.9
urn = [1.3,0.9]

#No. of simulations
simulations = 10000

#No. of draws
draws = 35

# simulate the draws from the urn
X=np.random.choice(urn,(draws,simulations))

# print first 10 elements as a check
print(X[1:10])

# print shape as a check
print(X.shape)

输出:

[[1.3 1.3 1.3 ... 0.9 1.3 1.3]
 [0.9 1.3 0.9 ... 0.9 0.9 0.9]
 [0.9 1.3 0.9 ... 1.3 1.3 0.9]
 ...
 [1.3 0.9 0.9 ... 1.3 0.9 0.9]
 [1.3 1.3 1.3 ... 0.9 0.9 1.3]
 [1.3 1.3 0.9 ... 0.9 1.3 1.3]]
(35, 10000)

我把退货的名字改成了瓮。在 python 中返回有点混乱。

【讨论】:

感谢您的帮助,但我每次运行需要 35 次抽签才能在最后进行计算。这也可以使用您的代码吗? @fhebe12 我现在已经在答案中包含了抽奖,【参考方案2】:

当你打电话时:

random.choices(returns,1)

python认为1对应权重,如果对应k可以选择返回的元素个数,必须这样指定:

random.choices(returns,k=1)

但默认为1,所以不需要通知它

【讨论】:

以上是关于用替换从瓮中绘制 2 个数字 - Python的主要内容,如果未能解决你的问题,请参考以下文章

列出样本空间?

排列组合面试

用python生成0-4,4个随机数,加或者减都等于4

python 中 请输入一个数字 请输入第二个数字 请输入进行的计算符合(1+ 2-):

python输入俩个数计算俩个数字之和

用python,turtle绘制数字,如绘制260这三个数字,同时要求每个数字填不同的颜色