鱼C论坛

 找回密码
 立即注册
查看: 4112|回复: 4

[已解决]关于抛硬币实验,要求出连续正面和连续反面的次数

[复制链接]
发表于 2020-12-15 14:58:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面是我写的代码,能跑起来,但是连续正面和连续反面的次数总是不对,求教是什么原因?
-----------------------------------------------------------------------------------------------

import random

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


while True:
    i = 0
    sum1 = 0
    sum2 = 0
    last = 0
    c_head = 0
    c_tail = 0
    max_head = 0
    max_tail = 0
    print("开始抛硬币实验......")
    while i < number:
        a = random.randint(1,10)
        if a % 2 == 0:
            sum1 += 1
            c_head += 1
            if number < 100:
                print("正面",end = " ")
            if c_head >= max_head:
                max_head = c_head
            if last == 2:
                c_head = 1           
            last = 1
            
            
        if a % 2 != 0:
            sum2 += 1
            c_tail += 1
            if number < 100:               
                print("反面",end = " ")
            if c_tail >= max_tail:
                max_tail = c_tail
            if last == 1:
                c_tail = 1
            last = 2
        i += 1
    print("一共模拟了",sum1 + sum2,"次抛硬币,结果如下:","\n正面:",sum1,"\n反面:",sum2)
    print("最多连续正面:",max_head,"次")
    print("最多连续反面:",max_tail,"次")
    number = int(input("\n请输入抛硬币的次数:"))

最佳答案
2020-12-15 15:48:04
先判断if last == 2:
                c_head = 1
然后再 c_head += 1
不然明明上次是背面,你却c_head再加1,导致最后c_head最大值--》反面---》c-head增加1--》c-head以比最大值大1的数值赋值给max_head,然后你才把c_head变成1.最终导致max_head比最大值大1.
反面同理


另外你最上边的while循环没有设置break语句,导致整个代码一直循环,停住也只是因为等待你输入。最好最后设置一下break结束循环
  1. import random

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


  3. while True:
  4.     i = 0
  5.     sum1 = 0
  6.     sum2 = 0
  7.     last = 0
  8.     c_head = 0
  9.     c_tail = 0
  10.     max_head = 0
  11.     max_tail = 0
  12.     print("开始抛硬币实验......")
  13.     while i < number:
  14.         a = random.randint(1,10)
  15.         if a % 2 == 0:
  16.             if last == 2:
  17.                 c_head = 1
  18.             sum1 += 1
  19.             c_head += 1
  20.             if number < 100:
  21.                 print("正面",end = " ")
  22.             if c_head >= max_head:
  23.                 max_head = c_head
  24.                        
  25.             last = 1
  26.             
  27.             
  28.         if a % 2 != 0:
  29.             if last == 1:
  30.                 c_tail = 1
  31.             sum2 += 1
  32.             c_tail += 1
  33.             if number < 100:               
  34.                 print("反面",end = " ")
  35.             if c_tail >= max_tail:
  36.                 max_tail = c_tail
  37.             
  38.             last = 2
  39.         i += 1
  40.     print("一共模拟了",sum1 + sum2,"次抛硬币,结果如下:","\n正面:",sum1,"\n反面:",sum2)
  41.     print("最多连续正面:",max_head,"次")
  42.     print("最多连续反面:",max_tail,"次")
  43.     s=input('还继续吗(Y/N):')
  44.     if s == 'Y':
  45.         number = int(input("\n请输入抛硬币的次数:"))
  46.     else:
  47.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-15 15:48:04 | 显示全部楼层    本楼为最佳答案   
先判断if last == 2:
                c_head = 1
然后再 c_head += 1
不然明明上次是背面,你却c_head再加1,导致最后c_head最大值--》反面---》c-head增加1--》c-head以比最大值大1的数值赋值给max_head,然后你才把c_head变成1.最终导致max_head比最大值大1.
反面同理


另外你最上边的while循环没有设置break语句,导致整个代码一直循环,停住也只是因为等待你输入。最好最后设置一下break结束循环
  1. import random

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


  3. while True:
  4.     i = 0
  5.     sum1 = 0
  6.     sum2 = 0
  7.     last = 0
  8.     c_head = 0
  9.     c_tail = 0
  10.     max_head = 0
  11.     max_tail = 0
  12.     print("开始抛硬币实验......")
  13.     while i < number:
  14.         a = random.randint(1,10)
  15.         if a % 2 == 0:
  16.             if last == 2:
  17.                 c_head = 1
  18.             sum1 += 1
  19.             c_head += 1
  20.             if number < 100:
  21.                 print("正面",end = " ")
  22.             if c_head >= max_head:
  23.                 max_head = c_head
  24.                        
  25.             last = 1
  26.             
  27.             
  28.         if a % 2 != 0:
  29.             if last == 1:
  30.                 c_tail = 1
  31.             sum2 += 1
  32.             c_tail += 1
  33.             if number < 100:               
  34.                 print("反面",end = " ")
  35.             if c_tail >= max_tail:
  36.                 max_tail = c_tail
  37.             
  38.             last = 2
  39.         i += 1
  40.     print("一共模拟了",sum1 + sum2,"次抛硬币,结果如下:","\n正面:",sum1,"\n反面:",sum2)
  41.     print("最多连续正面:",max_head,"次")
  42.     print("最多连续反面:",max_tail,"次")
  43.     s=input('还继续吗(Y/N):')
  44.     if s == 'Y':
  45.         number = int(input("\n请输入抛硬币的次数:"))
  46.     else:
  47.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-15 16:16:28 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-15 16:24 编辑
  1. import random

  2. maxa , maxb = 0 , 0
  3. number = int(input("请输入抛硬币的次数:"))
  4. print("开始抛硬币实验......")

  5. # 由于正反面计数需要连续,为了避免循环中的条件判断过于复杂,
  6. # 在循环开始前,先抛一次开个头,循环中的判断条件就单一化了。

  7. x = random . randint(1,10)
  8. if x % 2:
  9.     a , b = 1 , 0
  10. else:
  11.     a , b = 0 , 1
  12. for _ in range(number - 1):
  13.     x = random . randint(1,10)
  14.     if x % 2:
  15.         if a :
  16.             a += 1
  17.         else:
  18.             if b > maxb:
  19.                 maxb = b
  20.             a , b = 1 , 0
  21.     else:
  22.         if b:
  23.             b += 1
  24.         else:
  25.             if a > maxa:
  26.                 maxa = a
  27.             a , b = 0 , 1

  28. print("最多连续正面:", maxa ,"次")
  29. print("最多连续反面:", maxb ,"次")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 20:49:04 | 显示全部楼层

  # 导入随机模块 #
import random
# 接收用户输入并将数值赋值给 counts 变量 #
counts=int(input("请输入抛硬币次数:"))
i = 0
sum1=0
sum2=0
a=0
sum3=0
sum4=0
b=0
c=0
print("开始抛硬币实验:")
while i < counts:
        # 生成一个随机数num #
    num=random.randrange(0, 100, 1)
    if num % 2:
            # 打印结果 #
        if counts<100:
            print("正面",end=" ")
        sum1+=1
    else:
        if counts<100:
            print("反面",end=" ")
        sum2+=1
    if num%2 and a%2:
      
        sum3+=1#统计连续正面次数#
        if b<=sum3:
            b=sum3
    else:
        sum3=0
    if num%2==0 and a%2==0:
        
        sum4+=1#统计连续反面次数#
        if c<=sum4:
            c=sum4
    else:
        sum4=0
    i = i + 1
    a=num#记录前一次随机数值#

print("\n一共模拟了",counts,"次抛硬币,结果如下:")      
print("正面:",sum1,"次")
print("反面:",sum2,"次")
print("正面最多连续出现:",b+1)
print("反面最多连续出现:",c+1)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-16 16:42:37 | 显示全部楼层
你们发的好复杂我压根看不懂。。是我智商不够么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 16:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表