关于抛硬币连续计数正反问题的优化算法(第16讲 分支和循环III)
本帖最后由 漫天疯语 于 2021-1-28 18:05 编辑关于小甲鱼老师给出的算法中
# 利用 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 # 统计连续反面的最多次数
其中ignore和last我觉得可以省略,整个算法可以优化如下
from random import *
cs = input('请输入抛几次硬币:')
while cs != 'stop': #输入stop退出
while cs =='' or cs.isdigit() == False:#如果是空值或者不是整数则重新输入
cs = input('输入有误,请输入抛几次硬币:')
print("开始抛硬币实验:\n")
count = 0 #反面计数器
k = 0 #循环增量
cs = int(cs) #将字符串转换整型(总共抛硬币次数)
zcount = 0 #设置连续正面计数器
fcount = 0 #设置连续反面计数器
maxf = 1 #设置最大连续正面计数值存储器
maxz = 1 #设置最大连续反面计数值存储器
while k != cs:
x = randrange(2) #注意这里返回的随机数不包括结束值,即start <= x < stop
# 上句也可写成 x = int(randint(0,1)) #注意这里返回的整数值包括结束值,即0 <= x <= 1
# 上句也可写成 x = int(random.choices(range(2)) #注意这里返回的整数值不包括结束值,即0 <= x < 2
y = 0
if x == 0:
print('反面',end=' ')
fcount += 1 #如果连续反面则计数
zcount = 0#重置连续正面计数器
if maxf < fcount:# 如果最大连续反面计数小于此次连续负计数
maxf = fcount# 将最大的连续反面计数存储至maxf
else:
print('正面',end=' ')
zcount += 1 #如果连续正面则计数
fcount = 0 #重置连续反面计数器
count += 1 #连续反面计数器计数
if maxz < zcount:# 如果最大连续正计数小于此次连续正计数
maxz = zcount # 将最大的连续正面计数存储至maxf
k += 1
if k % 10 ==0: #一行写十个
print(' 这是第',k//10,'行')
print('抛硬币',cs,'次实验结束,其中正面',count,'次,反面',(cs-count),'次')
print('最多连续正面', maxz, '次','最多连续反面', maxf, '次')
cs = input('请输入抛几次硬币:')
是不是更容易读懂呢,哈哈,欢迎批评指正! 同意。高手的精简,有时候就是文言文,不容易看懂。白话文,啰嗦归罗嗦,瞟一眼就明白了,好理解。所以,生活中,我们用白话文,经典名著里,文言文好多。
页:
[1]