Python 骰子滚动输出
我已经完成了这段代码,但我需要帮助理解为什么输出与期望的不一样。这是我的密码。我的教授还说要用237粒种子Python 骰子滚动输出,python,dice,Python,Dice,我已经完成了这段代码,但我需要帮助理解为什么输出与期望的不一样。这是我的密码。我的教授还说要用237粒种子 import random rng = random.Random() rng.seed(237) NumberOfRolls = int(input("How many dice?:")) NumberOfFaces = int(input("How many sides of each dice?:")) numberOfTrials = int(input('How many tr
import random
rng = random.Random()
rng.seed(237)
NumberOfRolls = int(input("How many dice?:"))
NumberOfFaces = int(input("How many sides of each dice?:"))
numberOfTrials = int(input('How many trials? Enter:'))
# Set the number of elements in the list
#def throwDice():
def throwDice(NumberOfRolls):
return random.randrange(1,NumberOfFaces)
def rollAllDice(NumberOfRolls):
sum = 0;
for i in range(NumberOfRolls):
v = throwDice(NumberOfRolls);
sum = sum + v;
# print(v);
return sum;
# perform simulation, record and print frequencies
index = (NumberOfRolls*NumberOfFaces)+1;
frequency = [0]*index
rel_frequency_list = [0]*index
exp_prob_list =[0]*index
for i in range(numberOfTrials):
ind = rollAllDice(NumberOfRolls);
frequency[ind] = frequency[ind]+1;
# end for
print()
#print("Frequencies:")
# calculate relative frequencies, probabilities and errors
relativeFrequency = [0, 0]
probability = [0,0]
error = [0,0]
for i in range(2, len(frequency)):
rel_frequency_list[i] = frequency[i]/numberOfTrials;
exp_prob_list[i] = frequency[i]/100;
#print(relativeFrequency)
#print(probability)
#print(error)
print()
# print results
f1 = "{0:<10}{1:<22}{2:<22}{3:<22}"
f2 = 71*"-"
f3 = "{0:>3} {1:<22.15f}{2:<22.15f}{3:<.15f}"
print(f1.format("Sum","Frequency","Relative Frequency","Experimental Probability"))
print(f2)
for i in range(NumberOfRolls, len(frequency)):
print(f3.format(i, frequency[i], rel_frequency_list[i], exp_prob_list[i]),"%")
#end for
这是所需的(相同的输出):
以下是重新组织的版本:
from random import Random
def get_int(prompt):
while True:
try:
return int(input(prompt))
except ValueError:
pass
class Dice:
def __init__(self, num_dice, num_faces, seed=None):
self.num_dice = num_dice
self.num_faces = num_faces
self.rng = Random()
if seed is not None:
self.rng.seed(seed)
def roll(self):
return sum(self.rng.randint(1, self.num_faces) for _ in range(self.num_dice))
def histogram(self, num_trials):
hist = [0] * (self.num_dice * self.num_faces + 1)
for _ in range(num_trials):
hist[self.roll()] += 1
return hist
def main():
num_dice = get_int("How many dice? ")
num_faces = get_int("How many sides on each die? ")
num_trials = get_int("How many trials? ")
dice = Dice(num_dice, num_faces, 237)
hist = dice.histogram(num_trials)
print("Sum Frequency Relative Frequency Experimental Probability")
print("-" * 70)
lo = num_dice
hi = num_dice * num_faces
for n in range(lo, hi + 1):
freq = hist[n]
rfreq = freq / num_trials
print("{:d} {:d} {:0.5f} {:0.2f} %".format(n, freq, rfreq, 100. * rfreq))
if __name__ == "__main__":
main()
random.randrange()
的上限是独占的。尝试使用NumberOfFaces+1
。或者尝试使用random.randint()
更简单:)你的种子也没有做你想做的事情。使用random.seed(237)
然后使用random.randrange()
或randint()
。现在你正在为一个新的rng设定种子,却从未使用它。使用randint可以产生更接近更好的结果。如何使用种子?random.seed(237)
调用random.randint()时,它使用内部rng。您创建了一个新的,但从未使用过它-rng.randint()会使用它。我不确定OOP是否适合这个,而且您的模型对我来说没有意义。一个Dice
对象可能不应该有一个指示它有多少骰子的属性。也许类骰子游戏
?@AdamSmith OOP在这里不是必需的;它可以很容易地用普通函数完成。另一方面,OOP可以很容易地划分逻辑,更容易思考问题的每一部分,并减少对共享变量的依赖,即roll()需要知道有多少个骰子和多少个面,但你不想每次打电话都要重新指定。这可能是我的强尼最近来综合症。最近在Haskell land呆了一段时间,所以突然间OOP看起来开销太大了。当你只有一把锤子时,所有的世界都应该是函数——或者类似的东西:D@AdamSmith至于命名,Dice
就像一套骰子
对我来说似乎很习惯;如果您愿意,您当然可以称之为DiceCup
<代码>骰子游戏不太正确,因为它没有任何游戏逻辑<代码>直方图,严格来说,应该是一个独立的函数,而不是骰子
的成员。谢谢!还有谁能帮我删除额外的0吗?例如,后面的整数包括.00000000。
Sum Frequency Relative Frequency Experimental Probability
----------------------------------------------------------------------
3 45 0.00450 0.45 %
4 126 0.01260 1.26 %
5 281 0.02810 2.81 %
6 494 0.04940 4.94 %
7 677 0.06770 6.77 %
8 968 0.09680 9.68 %
9 1191 0.11910 11.91 %
10 1257 0.12570 12.57 %
11 1257 0.12570 12.57 %
12 1164 0.11640 11.64 %
13 932 0.09320 9.32 %
14 683 0.06830 6.83 %
15 469 0.04690 4.69 %
16 282 0.02820 2.82 %
17 122 0.01220 1.22 %
18 52 0.00520 0.52 %
from random import Random
def get_int(prompt):
while True:
try:
return int(input(prompt))
except ValueError:
pass
class Dice:
def __init__(self, num_dice, num_faces, seed=None):
self.num_dice = num_dice
self.num_faces = num_faces
self.rng = Random()
if seed is not None:
self.rng.seed(seed)
def roll(self):
return sum(self.rng.randint(1, self.num_faces) for _ in range(self.num_dice))
def histogram(self, num_trials):
hist = [0] * (self.num_dice * self.num_faces + 1)
for _ in range(num_trials):
hist[self.roll()] += 1
return hist
def main():
num_dice = get_int("How many dice? ")
num_faces = get_int("How many sides on each die? ")
num_trials = get_int("How many trials? ")
dice = Dice(num_dice, num_faces, 237)
hist = dice.histogram(num_trials)
print("Sum Frequency Relative Frequency Experimental Probability")
print("-" * 70)
lo = num_dice
hi = num_dice * num_faces
for n in range(lo, hi + 1):
freq = hist[n]
rfreq = freq / num_trials
print("{:d} {:d} {:0.5f} {:0.2f} %".format(n, freq, rfreq, 100. * rfreq))
if __name__ == "__main__":
main()