要求

1.如果抛硬币的次数小于 100,则打印每次的结果,否则不打印
2.统计最终正面和反面的次数
3.让程序分别统计正反面最多出现连续的次数

效果图如下:

python模拟抛硬币的结果 python 抛硬币_python

思考

1.硬币正反面可以用奇数偶数代替,引入random模块
2.需要统计的数:抛得次数、连续正面的次数、连续反面的次数、连续正面的最多次数、连续反面的最多次数、记录上次硬币状态
3.需要判断的:投硬币次数与100的比较、连续正反面的次数与连续正反面的最多次数的比较

代码

版本一

import random
counts = int(input('请输入抛硬币的次数:'))
print('开始投抛硬币实验......')
i = 0 #初始化实际抛硬币的次数
heads = 0 #初始化正面的次数
tails = 0 #初始化反面的次数
c_heads = 0 #初始化连续正面的次数
c_tails = 0 #初始化连续反面的次数
max_c_heads = 0 #初始化连续正面的最多次数
max_c_tails = 0 #初始化连续反面的最多次数
last = 0
while i < counts:#当最终实际抛硬币的次数与要求次数相等时,不执行此循环
    num = random.randint(1,10)#模拟随机投掷硬币
    if counts < 100:
        if num % 2:#num为奇数时为正面
            print('正面',end = ' ')
            heads += 1
            c_heads += 1
            if last == 2:# 如果上一次是反面,将连续正面的次数设置为1
                c_heads = 1
            if c_heads > max_c_heads:#判断连续正面的次数是否比max_c_heads大,如果是,替换
                max_c_heads = c_heads
            last = 1#一定要等统计好再对last赋值,否则不能统计出连续正面
        else:#num为偶数时为反面
            print('反面',end = ' ')
            tails += 1
            c_tails += 1
            if last == 1:
                c_tails = 1
            if c_tails > max_c_tails:
                max_c_tails = c_tails
            last = 2
        i += 1
    else:#超过100次时,不打印正反面只统计
        if num % 2:#num为奇数时为正面
            heads += 1
            c_heads += 1
            if last == 2:# 如果上一次是反面,将连续正面的次数设置为1
                c_heads = 1
            if c_heads > max_c_heads:#判断连续正面的次数是否比max_c_heads大,如果是,替换
                max_c_heads = c_heads
            last = 1#记录硬币状态,1为正面,2为反面
        else:#num为偶数时为反面
            tails += 1
            c_tails += 1
            if last == 1:
                c_tails = 1
            if c_tails > max_c_tails:
                max_c_tails = c_tails
            last = 2
        i += 1
print('一共模拟了',counts,'次抛硬币,结果如下:',end = '\n')
print('正面:',heads,'次')
print('反面:',tails,'次')
print('最多连续正面',max_c_heads,'次')
print('最多连续反面',max_c_tails,'次')

版本二

import random

counts = int(input("请输入抛硬币的次数:"))

# 利用 ignore 变量来判断是否打印每次的结果
if counts > 100:
    ignore = True
else:
    ignore = False

heads = 0 # 统计正面的次数
tails = 0 # 统计反面的次数

last = 0 # 记录上一次的状态,如果是正面设置为1, 反面则设置为2
c_heads = 0 # 统计连续正面的次数
c_tails = 0 # 统计连续反面的次数
max_heads = 0 # 统计连续正面的最多次数
max_tails = 0 # 统计连续反面的最多次数

i = 0
print("开始抛硬币实验……")
while i < counts:
    num = random.randint(1, 10)

    if num % 2:
        heads += 1
        c_heads += 1

        if not ignore:       
            print("正面", end=" ")

        # 如果上一次是反面:将连续正面的次数设置为1
        if last == 2:
            c_heads = 1

        # 判断连续正面的次数是否比max_heads大,如果是,取而代之
        if c_heads > max_heads:
            max_heads = c_heads

        # 将上一次的状态设置为正面
        last = 1
    else:
        tails += 1
        c_tails += 1
        
        if not ignore:
            print("反面", end=" ")

        # 如果上一次是正面:连续反面的次数设置为1
        if last == 1:
            c_tails = 1

        # 判断连续反面的次数是否比max_tails大,如果是,取而代之
        if c_tails > max_tails:
            max_tails = c_tails

        # 将上一次的状态设置为反面
        last = 2
        
    i += 1

print("")
print("一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", heads, "次", sep="")
print("反面:", tails, "次", sep="")
print("最多连续正面:", max_heads, "次", sep="")
print("最多连续反面:", max_tails, "次", sep="")