Monte Carlo 模拟给出 0 作为输出

Monte Carlo Simulation giving 0 as output

我 运行 进行了一个实验,其中我得到了 6 个不同的大小数量级,现在我想看看我的观察结果是否有意义。我必须执行 MC 模拟以获得 p 值,以查看我的观察值与空值相比是异常大还是小。

我需要:

我应该有 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 01,而不是 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,以避免不必要的测试。如果这样做,则不需要测试范围的两端,因为之前的测试排除了低于范围底部的数字。

您的条件重叠 -- 如果 numbers1/6 的精确倍数,它将被放入两个容器中。

您还可以完全删除所有 if 语句:

    sim_orders[floor(numbers*6)] += 1