Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 骰子滚动输出_Python_Dice - Fatal编程技术网

Python 骰子滚动输出

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

我已经完成了这段代码,但我需要帮助理解为什么输出与期望的不一样。这是我的密码。我的教授还说要用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 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()