Python 输出为0的蒙特卡罗模拟

Python 输出为0的蒙特卡罗模拟,python,statistics,montecarlo,Python,Statistics,Montecarlo,我做了一个实验,得到了6种不同的大小,现在我想看看我的观察结果是否有意义。我必须执行MC模拟,以获得一个p值,以查看我观察到的值与空值相比是否异常大或小 我需要: 设置一个方案,其中订单1为0到1/6,订单2为1/6到2/6,订单3为2/6到3/6 生成20个介于0和1之间的随机数,并将其分配到这些箱子。如果数字小于1/6,则将其放入料仓1;如果数字介于1/6和2/6之间,则将其放入料仓2,以此类推- 我应该有6个新的数字,每个箱子一个,加起来是20,但我的输出是0。我是python新手,那

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

我需要:

  • 设置一个方案,其中订单1为0到1/6,订单2为1/6到2/6,订单3为2/6到3/6
  • 生成20个介于0和1之间的随机数,并将其分配到这些箱子。如果数字小于1/6,则将其放入料仓1;如果数字介于1/6和2/6之间,则将其放入料仓2,以此类推-
我应该有6个新的数字,每个箱子一个,加起来是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)
来自随机导入randint
从随机输入种子
#种子随机数发生器
种子(1)
计数器=0
chi_sq_值=[]
#想要10000个模拟吗
当计数器<10000时:
#最终会模仿你真正的六个订单大小
模拟顺序=[0,0,0,0,0,0]
#生成20个随机数
对于范围(20)内的i:
数字=randint(0,1)

如果0如果您不想用零更新您的列表模拟订单,那么您应该在循环时将其置于之外。此外,我看不出你在哪里用生成的数字更新你的列表。如果你想让你的while循环是有限的,那么你必须增加循环体内部的计数器。

你不是在增加模拟顺序中的值。
。您正在将
sim_orders
中的值添加到
numbers
,这没有任何效果,因为该值始终为
0
。然后,在添加到
数字之后,您就不会对其执行任何操作了

您应该在模拟订单中增加相应的计数器

您需要使用
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

这段代码中有很多错误<代码>计数器+=1
未写入,并且
sim卡订单=[0,0,0,0,0,0]
它们都是0,您永远不会更改它们的值,因此
如何打印(sim卡订单)
除了
[0,0,0,0,0,0,0,0]
我尝试过这个,但它只是在sim卡订单的[0]和[5]位置添加了数字。elif point很好,谢谢!因为你用了
randint
而不是
random
啊,谢谢你:这很奇怪,因为一个在线指南告诉我要用randint!还有一个问题:我如何让我的代码在达到10000次模拟后停止运行?它目前一直在运行,直到您永远不会增加计数器。对范围(10000)内的计数器使用
您确定在线指南显示了如何生成0到1之间的数字吗?
    sim_orders[floor(numbers*6)] += 1