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



我已经使用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)

返回CCD_ 1。这个数字不正确,(我认为(因为它不接近10^6。我试着去掉里面的内容,然后再做一次,但没有成功,数字离10^6很远。有人看到这个有问题吗?

注意:我不是在要求修复代码或其他什么,我是在问是否出现了问题,以获得上面的数字,而不是100000

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

  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。因此,在获得一组重复之前,预期的试验次数为105。上面的代码在我的计算机上运行了5分钟多一点,并产生了102493.559 (96461.16185897154, 108525.95614102845)作为输出。四舍五入到整数,这意味着试验的平均次数为102493次,我们有95%的信心真正的平均值在96461到108526之间。这个特定的范围包含105,也就是说,它与期望值一致。重新运行程序会产生不同的数字,但95%的此类运行也应该包含预期值,少数不包含的值应该仍然很接近。

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

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

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

使用楼层划分而不是划分标志会将数字四舍五入为整数,这更适合你想要做的事情。

如果您使用的是浮点数,也许可以使用%。这不仅会对你的数字进行除法运算,而且只会返回余数。

%是python 中的模块

//是python 中的楼层划分

如果你的总数返回一个浮点整数,这些符号将使你的数字保持稳定,更容易计算。

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

如果是这样的话,你的结果将永远不会达到10x^6,因为你的价值总和线被卡在了一个循环中。

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

最新更新