使用rand.int有一段时间了,看到了意想不到的结果

2024-10-03 23:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用rand.int函数运行了一个小时左右的代码,其中的代码模拟了骰子的滚动,骰子有十个面,你必须连续滚动六次,每次滚动相同的数字,并且它正在跟踪发生这种情况所需的尝试次数

success = 0
times = 0
count = 0
total = 0

for h in range(0,100):
    for i in range(0,10):
        times = 0

        while success == 0:
            
            numbers = [0,0,0,0,0,0,0,0,0,0]
        
            for j in range(0,6):
            
                x = int(random.randint(0,9))
                numbers[x] = 1
        
                count = numbers.count(1)
            
            if count == 1:
                success = 1
            else:
                times += 1
    

        print(i)
        total += times
        success = 0


    randtst = open("RandomTesting.txt", "a" )
    randtst.write(str(total / 10)+"\n")
    randtst.close()




运行这段代码,它已经进入一个文件,其内容如下 https://pastebin.com/7kRK1Z5f 并使用

newtotal = 0
totalamounts = 0

with open ('RandomTesting.txt', 'rt') as rndtxt:  
    for myline in rndtxt:              ,
        newtotal += float(myline)
        totalamounts += 1

print(newtotal / totalamounts)

返回742073.7449342106。这个数字是不正确的,(我想)因为这不接近10^6。我试着去掉这些内容,然后再做一次,但是没有用,这个数字远没有接近10^6。有人能看出这有什么问题吗

注意:我不是要求对代码或任何东西进行修复,我是问是否出现了错误以获得上述数字,而不是100000


Tags: 代码inforcountrange数字骰子int
2条回答

我可以建议,如果你使用整数,你应该返回一个整数,而不是浮点数(如果我理解你的意图的话)

##randtst.write(str(total / 10)+"\n")原件

##randtst.write(str(total // 10)+"\n")

使用楼层分隔符而不是分隔符可以将数字四舍五入为整数,这更符合您的意图

如果您使用的是浮点数,可能会使用%来代替。这不仅会除以数字,而且只返回余数

%在python中是模

//是python中的楼层划分

如果总数返回一个浮点整数,这些符号将使数字保持稳定并更易于操作

如果不是这样的话,你就必须计算出小数点后面的每一个数字

如果是这种情况,你的结果将永远不会达到10x^6,因为求和你的值的那一行被卡在了一个循环中

我希望这对您有所帮助,如果没有,请告诉我,因为我也在学习python

这里有几个问题对你不利。底线在前面:

  1. 你的代码没有达到你所说的意图
  2. 你目前没有衡量你的结果是否与理论答案相符的标准;及
  3. 你对正确答案的期望是不正确的

我觉得您的代码对于您描述的任务来说过于复杂,所以我从头开始编写了自己的版本。我计算出了滚动六个10面骰子的基本实验,并通过创建一个由10面骰子滚动组成的长度为6的列表来检查结果是否都相等。我无耻地借用BoarGules的评论,将结果放入一个只存储唯一元素的集合中,并计算集合的大小。当且仅当集合的大小为1时,骰子的值都相同。当不同元素的数量大于1时,我不断重复这一点,记录所需的试验次数,并在获得相同的模辊后返回试验次数

然后,对任何所需数量的复制运行该基本实验,并将结果放入numpy数组中。结果数据由numpy和scipy处理,得出平均试验次数和平均值的95%置信区间。置信区间使用结果的估计可变性来构造平均值的下限和上限。如果基本假设得到满足,以这种方式生成的边界应包含以这种方式生成的95%估计值的真实平均值,并解决我的BLUF中的第二点

代码如下:

import random
import scipy.stats as st
import numpy as np

NUM_DIGITS = 6
SAMPLE_SIZE = 1000

def expt():
    num_trials = 1
    while(len(set([random.randrange(10) for _ in range(NUM_DIGITS)])) > 1):
        num_trials += 1
    return num_trials

data = np.array([expt() for _ in range(SAMPLE_SIZE)])
mu_hat = np.mean(data)
ci = st.t.interval(alpha=0.95, df=SAMPLE_SIZE-1, loc=mu_hat, scale=st.sem(data))
print(mu_hat, ci)

从10面模具中产生6个特定值的相同结果的概率为10-6,但有10个可能的特定值,因此产生所有重复的总概率为10*10-6,或10-5。因此,在获得一组复制品之前,预期的试验次数为10次5次。上面的代码在我的计算机上运行了5分钟多一点,并生成了102493.559 (96461.16185897154, 108525.95614102845)作为输出。四舍五入到整数,这意味着平均试验次数为102493次,我们有95%的信心认为真实平均数介于96461和108526之间。该特定范围包含105,即与预期值一致。重新运行程序将产生不同的数字,但95%的运行也应该包含预期值,不包含预期值的少数应该仍然很接近

相关问题 更多 >