python—已经使用rand.int一段时间了,并且看到了意外的结果

vatpfxk5  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(233)

我已经用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。有人看到这个问题吗?

mcdcgff0

mcdcgff01#

这里有几个问题对你不利。底线在前面:
你的代码没有达到你所说的意图;
你目前没有衡量你的结果是否与理论答案相符的标准;和
你对正确答案的期望是不正确的。
我觉得您的代码对于您描述的任务来说过于复杂,所以我从头开始编写了自己的版本。我计算出了滚动六个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。因此,在获得一组副本之前,预期的试验次数是105次。上面的代码在我的计算机上运行了5分钟多一点,并生成了 102493.559 (96461.16185897154, 108525.95614102845) 作为输出。四舍五入为整数,这意味着平均试验次数为102493次,我们95%相信真实平均数介于96461和108526之间。该特定范围包含105次,即与预期值一致。重新运行程序将产生不同的数字,但95%的运行也应该包含预期值,不包含预期值的少数应该仍然很接近。

brtdzjyr

brtdzjyr2#

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

randtst.write(str(总计/10)+“\n”)原件

randtst.write(str(总计//10)+“\n”)

使用楼层分隔符而不是分隔符可以将数字四舍五入为整数,这更符合您的意图。
如果您使用的是浮点数,可能会使用%来代替。这不仅会除以数字,而且只返回余数。
%是python中的模
//是python中的楼层划分吗
如果总数返回一个浮点整数,这些符号将使数字保持稳定并更易于操作。
如果不是这样的话,你就必须计算出小数点后面的每一个数字。
如果是这种情况,你的结果将永远不会达到10x^6,因为求和你的值的那一行被卡在了一个循环中。
我希望这对您有所帮助,如果没有,请告诉我,因为我也在学习python。

相关问题