Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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,我在试着模拟n个垃圾游戏。代码对我来说似乎有意义,但我从未得到正确的结果。例如,如果我把n=5,即五局比赛,赢和输的总和大于5 下面是它的工作原理:如果初始掷骰是2、3或12,玩家将输球。如果掷骰数为7或11,则该玩家获胜。任何其他初始掷骰都会导致玩家再次掷骰。他继续滚动,直到滚动7或达到初始滚动值。如果他在掷7之前重新掷初始值,那就是胜利。先掷7是一种损失 from random import randrange def roll(): dice = randrang

我在试着模拟n个垃圾游戏。代码对我来说似乎有意义,但我从未得到正确的结果。例如,如果我把n=5,即五局比赛,赢和输的总和大于5

下面是它的工作原理:如果初始掷骰是2、3或12,玩家将输球。如果掷骰数为7或11,则该玩家获胜。任何其他初始掷骰都会导致玩家再次掷骰。他继续滚动,直到滚动7或达到初始滚动值。如果他在掷7之前重新掷初始值,那就是胜利。先掷7是一种损失

from random import randrange

    def roll():
        dice = randrange(1,7) + randrange (1,7)
        return dice

    def sim_games(n):
        wins = losses = 0
        for i in range(n):
            if game():
                wins = wins + 1
            if not game():
                losses = losses + 1
        return wins, losses

    #simulate one game

    def game():

            dice = roll()
            if dice == 2 or dice == 3 or dice == 12:
                return False
            elif dice == 7 or dice == 11:
                return True
            else:
                dice1 = roll()
                while dice1 != 7 or dice1 != dice:
                    if dice1 == 7:
                        return False
                    elif dice1 == dice:
                        return True
                    else:
                        dice1 = roll()

    def main():

        n = eval(input("How many games of craps would you like to play? "))
        w, l = sim_games(n)

        print("wins:", w,"losses:", l)
问题在于

        if game():
            wins = wins + 1
        if not game():
            losses = losses + 1
相反,它应该是

        if game():
            wins = wins + 1
        else:
            losses = losses + 1
在您的代码中,您正在模拟两个游戏,而不是通过调用两次游戏来模拟一个游戏。这将给出四种可能的结果,而不是两种赢/输,从而给出不一致的总体结果。

在本代码中

for i in range(n):
    if game():
        wins = wins + 1
    if not game():
        losses = losses + 1
你打了两次比赛,所以你就在那里打了两次比赛。您需要的是一个else块:

for i in range(n):
    if game():
        wins = wins + 1
    else:
        losses = losses + 1
顺便说一句,您可以通过以下方式简化逻辑:


代码与您给出的描述完全相同。

此代码存在许多问题。最重要的是,每个循环调用游戏两次。您需要调用它一次并存储结果,然后在此基础上进行切换。

不要这样做

    for i in range(n):
        if game():
            wins = wins + 1
        if not game():
            losses = losses + 1
它一点也不好用。

OO重写:

import random

try:
    rng = xrange   # Python 2.x
    inp = raw_input
except NameError:
    rng = range    # Python 3.x
    inp = input

def makeNSidedDie(n):
    _ri = random.randint
    return lambda: _ri(1,n)

class Craps(object):
    def __init__(self):
        super(Craps,self).__init__()
        self.die = makeNSidedDie(6)
        self.firstRes = (0, 0, self.lose, self.lose, 0, 0, 0, self.win, 0, 0, 0, self.win, self.lose)
        self.reset()

    def reset(self):
        self.wins   = 0
        self.losses = 0

    def win(self):
        self.wins += 1
        return True

    def lose(self):
        self.losses += 1
        return False

    def roll(self):
        return self.die() + self.die()

    def play(self):
        first = self.roll()
        res   = self.firstRes[first]
        if res:
            return res()
        else:
            while True:
                second = self.roll()
                if second==7:
                    return self.lose()
                elif second==first:
                    return self.win()

    def times(self, n):
        wins = sum(self.play() for i in rng(n))
        return wins, n-wins

def main():
    c = Craps()

    while True:
        n = int(inp("How many rounds of craps would you like to play? (0 to quit) "))
        if n:
            print("Won {0}, lost {1}".format(*(c.times(n))))
        else:
            break

    print("Total: {0} wins, {1} losses".format(c.wins, c.losses))

if __name__=="__main__":
    main()

你得到了什么结果?你想跑多少场比赛,那么多比赛你能赢多少场?randrange1,7不是模拟了一个七面骰子吗?@John:不,Python中的范围是半开放的,也就是说,7不包括在内,你从开始到结束都有start-stop=6个选项-1.random.randint1,6可能会更清楚。@delnan:谢谢你的解释。你能不能更具体一点,告诉我这些问题是什么?我修复了两次调用游戏函数的问题,现在似乎工作正常。任何对eval的调用都应该受到极大的怀疑。如果需要int,请调用int,而不是eval。Eval可以执行任意代码。还有一些初始化的变量没有使用。
import random

try:
    rng = xrange   # Python 2.x
    inp = raw_input
except NameError:
    rng = range    # Python 3.x
    inp = input

def makeNSidedDie(n):
    _ri = random.randint
    return lambda: _ri(1,n)

class Craps(object):
    def __init__(self):
        super(Craps,self).__init__()
        self.die = makeNSidedDie(6)
        self.firstRes = (0, 0, self.lose, self.lose, 0, 0, 0, self.win, 0, 0, 0, self.win, self.lose)
        self.reset()

    def reset(self):
        self.wins   = 0
        self.losses = 0

    def win(self):
        self.wins += 1
        return True

    def lose(self):
        self.losses += 1
        return False

    def roll(self):
        return self.die() + self.die()

    def play(self):
        first = self.roll()
        res   = self.firstRes[first]
        if res:
            return res()
        else:
            while True:
                second = self.roll()
                if second==7:
                    return self.lose()
                elif second==first:
                    return self.win()

    def times(self, n):
        wins = sum(self.play() for i in rng(n))
        return wins, n-wins

def main():
    c = Craps()

    while True:
        n = int(inp("How many rounds of craps would you like to play? (0 to quit) "))
        if n:
            print("Won {0}, lost {1}".format(*(c.times(n))))
        else:
            break

    print("Total: {0} wins, {1} losses".format(c.wins, c.losses))

if __name__=="__main__":
    main()