Monte Carlo 模拟给出 0 作为输出
Monte Carlo Simulation giving 0 as output
我 运行 进行了一个实验,其中我得到了 6 个不同的大小数量级,现在我想看看我的观察结果是否有意义。我必须执行 MC 模拟以获得 p 值,以查看我的观察值与空值相比是异常大还是小。
我需要:
- 设置一个方案,其中阶数1是0到1/6,阶数2是1/6-到2/6,阶数3是2/6到3/6
- 生成 20 个 运行0 和 1 之间的 dom 数字并将它们分配到这些 bin 中。如果数字 < 1/6 将其放入 bin 1,如果它在 1/6 和 2/6 之间则放入 bin 2 等 -
我应该有 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, 0, 0, 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,那么您应该将它 out of while 循环.此外,我看不到您在哪里使用生成的数字更新列表。如果你希望你的 while 循环是有限的,那么你必须在循环体内增加计数器。
您没有增加 sim_orders
中的值。您将 sim_orders
中的值添加到 numbers
,这没有任何效果,因为该值始终是 0
。然后你在添加到 numbers
之后没有对它做任何事情。
您应该在 sim_orders
中增加适当的计数器。
您需要使用 random.random()
,而不是 random.randint(0, 1)
。后者只是 return 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
的精确倍数,它将被放入两个容器中。
您还可以完全删除所有 if
语句:
sim_orders[floor(numbers*6)] += 1
我 运行 进行了一个实验,其中我得到了 6 个不同的大小数量级,现在我想看看我的观察结果是否有意义。我必须执行 MC 模拟以获得 p 值,以查看我的观察值与空值相比是异常大还是小。
我需要:
- 设置一个方案,其中阶数1是0到1/6,阶数2是1/6-到2/6,阶数3是2/6到3/6
- 生成 20 个 运行0 和 1 之间的 dom 数字并将它们分配到这些 bin 中。如果数字 < 1/6 将其放入 bin 1,如果它在 1/6 和 2/6 之间则放入 bin 2 等 -
我应该有 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, 0, 0, 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,那么您应该将它 out of while 循环.此外,我看不到您在哪里使用生成的数字更新列表。如果你希望你的 while 循环是有限的,那么你必须在循环体内增加计数器。
您没有增加 sim_orders
中的值。您将 sim_orders
中的值添加到 numbers
,这没有任何效果,因为该值始终是 0
。然后你在添加到 numbers
之后没有对它做任何事情。
您应该在 sim_orders
中增加适当的计数器。
您需要使用 random.random()
,而不是 random.randint(0, 1)
。后者只是 return 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
的精确倍数,它将被放入两个容器中。
您还可以完全删除所有 if
语句:
sim_orders[floor(numbers*6)] += 1