如何解决蒙特卡罗模拟给出 0 作为输出
我进行了一个实验,其中我得到了 6 个不同数量的大小,现在我想看看我的观察是否重要。我必须执行 MC 模拟以获得 p 值,以查看我的观察值与空值相比是异常大还是小。
我需要:
- 设置一个方案,Order 1 是 0 到 1/6,Order 2 是 1/6-到 2/6,Order 3 是 2/6 到 3/6
- 生成 0 到 1 之间的 20 个随机数并将它们分配给这些 bin。如果数字 if
我应该有 6 个新数字,每个 bin 一个,加起来为 20,但我的输出是 0。我是 Python 新手,所以我做错了什么?
我的代码在这里:
from random import randint
from random import seed
# seed random number generator
seed(1)
counter = 0
chi_sq_values = []
# want 10,000 simulations
while counter < 10000:
# will eventually mimic your real six orders of size
sim_orders = [0,0]
# generating 20 random numbers
for i in range(20):
numbers = randint(0,1)
if 0 <= numbers <= 1 / 6:
numbers += sim_orders[0]
if 1 / 6 <= numbers <= 2 / 6:
numbers += sim_orders[1]
if 2 / 6 <= numbers <= 3 / 6:
numbers += sim_orders[2]
if 3 / 6 <= numbers <= 4 / 6:
numbers += sim_orders[3]
if 4 / 6 <= numbers <= 5 / 6:
numbers += sim_orders[4]
if 5 / 6 <= numbers <= 6 / 6:
numbers += sim_orders[5]
print(sim_orders)
解决方法
您没有增加 sim_orders
中的值。您将 sim_orders
中的值添加到 numbers
,这没有任何效果,因为该值始终为 0
。然后,添加到 numbers
后,您将不会对其进行任何操作。
您应该在 sim_orders
中增加适当的计数器。
您需要使用 random.random()
,而不是 random.randint(0,1)
。后者只会返回 0
或 1
,而不是介于 0 和 1 之间的数字。
for i in range(20):
numbers = random.random()
if numbers <= 1 / 6:
sim_orders[0] += 1
elif numbers <= 2 / 6:
sim_orders[1] += 1
elif numbers <= 3 / 6:
sim_orders[2] += 1
elif numbers <= 4 / 6:
sim_orders[3] += 1
elif numbers <= 5 / 6:
sim_orders[4] += 1
else:
sim_orders[5] += 1
您还应该将 elif
用于一系列互斥条件,以避免不必要的测试。如果你这样做,你就不需要测试范围的两端,因为之前的测试排除了低于范围底部的数字。
您的条件重叠 -- 如果 numbers
是 1/6
的精确倍数,它将被放入两个 bin 中。
您也可以完全删除所有 if
语句:
sim_orders[floor(numbers*6)] += 1
,
如果您不想用零更新您的列表sim_orders,那么您应该将它排除 while 循环。此外,我看不到您在哪里使用生成的数字更新列表。如果你希望你的 while 循环是有限的,那么你必须在循环体内增加 counter。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。