模拟同时翻转2枚硬币的程序

时间:2018-05-01 16:35:58

标签: python

我的任务是创建一个程序,模拟同时抛出2个硬币。如果两个头,那么A组得到一个点;如果两个尾巴然后B组得到一个点。如果硬币不同,那么教授得到一分。该计划必须采取2个输入:游戏数量和每场比赛的投掷次数。以下是2个单独的示例运行说明:

How many games? 1
How many coin tosses per game? 100
Game 0:
 Group A: 25 (25.0%); Group B: 19 (19.0%); Prof: 56 (56.0%)
Wins: Group A=0 (0.0%); Group B=0 (0.0%); Prof=1 (100.0%)

How many games? 5
How many coin tosses per game? 10
Game 0:
 Group A: 3 (30.0%); Group B: 1 (10.0%); Prof: 6 (60.0%)
Game 1:
 Group A: 6 (60.0%); Group B: 1 (10.0%); Prof: 3 (30.0%)
Game 2:
 Group A: 4 (40.0%); Group B: 1 (10.0%); Prof: 5 (50.0%)
Game 3:
 Group A: 4 (40.0%); Group B: 1 (10.0%); Prof: 5 (50.0%)
Game 4:
 Group A: 5 (50.0%); Group B: 3 (30.0%); Prof: 2 (20.0%)
Wins: Group A=2 (40.0%); Group B=0 (0.0%); Prof=3 (60.0%)

我的代码(尽管很笨拙)适用于输入,模拟硬币投掷,以及计算和显示每组的点数和百分比。然而,我的问题在于计算和存储所有比赛中的胜利数量。这是我现在的代码:

import random

def coinFlip():
    games = input("How many games? ")
    tosses = input("How many coin tosses per game? ")

    for i in range(games):
        gA = 0
        gAW = 0
        gB = 0
        gBW = 0
        prof = 0
        profW = 0

        for j in range(tosses):
            flip1 = random.randint(0, 1)
            flip2 = random.randint(0, 1)

            if (flip1 == 0 and flip2 == 0):
                gA += 1
            elif (flip1 == 1 and flip2 == 1):
                gB += 1
            else:
                prof += 1

            gAper = ((gA * 1.0) / tosses) * 100
            gBper = ((gB * 1.0) / tosses) * 100
            profper = ((prof * 1.0) / tosses) * 100

        if (gA > gB and gA > prof):
            gAW += 1
        elif (gB > gA and gB > prof):
            gBW += 1
        elif ( prof > gA and prof > gB):
            profW += 1

        gAWper = ((gAW * 1.0) / games) * 100
        gBWper = ((gBW * 1.0) / games) * 100
        profWper = ((profW * 1.0) / games) * 100

        print "Game {}:".format(i)
        print " Group A: {} ({}%); Group B: {} ({}%); Prof: {} ({}%)".format(gA, gAper, gB, gBper, prof, profper)
        print "Wins: Group A = {} ({}%); Group B = {} ({}%); Prof: {} ({}%)".format(gAW, gAWper, gBW, gBWper, profW, profWper)

我想我应该将胜利存储在一个列表中,但这就是我迷失的地方。

2 个答案:

答案 0 :(得分:0)

关键问题是你在每场比赛开始时都重置了长期计数。因此,没有人能够记录多个胜利。这适用于我周一晚的飞盘游戏,但对你的任务无效。

返回你的伪代码并查看循环和初始化的匹配位置。这是代码版本:

def coinFlip():

# Set-up you do only once per program execution
games = input("How many games? ")
tosses = input("How many coin tosses per game? ")
games_won_A = 0
games_won_B = 0
games_won_prof = 0

for i in range(games):
    # Set-up things you do once per game
    tosses_won_A = 0
    tosses_won_B = 0
    tosses_won_prof = 0

    for j in range(tosses):
        # Things you do every toss
        flip1 = random.randint(0, 1)
        flip2 = random.randint(0, 1)
        ...

    # Summary things you do every game
    # ... such as compute percentages

# Summary things you do at the end of the program execution
# ... such as print the overall totals

这会让你感动吗?

顺便说一句<请注意,如果将计数器放入列表中,这将变为 lot 。例如,计算每次翻转的获胜者就成了一行:

win_count[flip1 + flip2] += 1

win_count可以是三个元素的列表,按顺序记录A,prof和B的胜利。

答案 1 :(得分:0)

这可能不是OP所寻求的,但通常使用numpy生成随机数可以快速简单地完成此任务。

import numpy as np

# get these from input or wherever
games = 5
tosses = 10
n_coins = 2

experiment = np.random.randint(2,size=(games, tosses, n_coins))
flip_results = experiment.sum(axis=2) # 0 means group A wins, 1 Prof, 2 group B
game_results = np.stack((flip_results == 0, flip_results == 1, flip_results == 2))
game_results = game_results.sum(axis=2)
total_results = game_results.sum(axis=1)
print(game_results, total_results)