首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定100次翻转中出现6次正面或6次尾的机会,重复10000次。

确定100次翻转中出现6次正面或6次尾的机会,重复10000次。
EN

Code Review用户
提问于 2023-05-05 16:19:30
回答 1查看 94关注 0票数 1

这里是problem从书上自动完成无聊的工作

编写一个程序,找出在随机生成的正面和反面列表中,一个由6个正面或6个尾组成的条纹出现的频率。

#comments是作者的提示。我创建的这个程序运行得很好,但是对我来说,裸奔的几率却是惊人的高:~152% - 153%。所以我想知道我的逻辑是否正确?任何帮助都将不胜感激。

代码语言:javascript
复制
import random

def flip():
    random_num = random.randint(0, 1)
    if random_num == 1:
        return "H"
    else:
        return 'T'
            
numberOfStreaks = 0 #author wrote this line
for experimentNumber in range(10000): #author wrote this line
# Code that creates a list of 100 'heads' or 'tails' values.

    head_tail_str = ""
    side = flip() 
    head_tail_str += side
    for _ in range(99):
        prev_side = side
        side = flip()
        if side != prev_side:
            head_tail_str += f",{side}"
        else:
            head_tail_str += side

# Code that checks if there is a streak of 6 heads or tails in a row.

    head_tail_lst = head_tail_str.split(',')
    for item in head_tail_lst:
        if len(item) >= 6:
            numberOfStreaks += (int(len(item)) // 6)

print('Chance of streak: %s%%' % (numberOfStreaks / 100)) #author wrote this line

我已经学了一个月的Python了

EN

回答 1

Code Review用户

回答已采纳

发布于 2023-05-05 18:08:10

逻辑

代码语言:javascript
复制
            numberOfStreaks += (int(len(item)) // 6)

一条12 H的条纹是否意味着2条?

一个六头的条纹或六个尾巴的条纹出现的频率有多高?

在我看来,这听起来就像numberOfStreaks,不知道为什么要把它与100进行比较,以获得一定的百分比:

代码语言:javascript
复制
print('Chance of streak: %s%%' % (numberOfStreaks / 100)) #author wrote this line
代码语言:javascript
复制
for experimentNumber in range(10000): #author wrote this line

以上所示的代码是为运行多个测试设计的。要做到这一点,每个试验都是独立的,这很重要,这意味着状态(值/数据)不会从一个试验流到另一个试验。

如果您使用以下行运行脚本,您将看到这种情况不会发生:

代码语言:javascript
复制
for experimentNumber in range(1):

结构

建议使用list而不是str来收集翻转,这更自然地表示了“一堆项目”。

它还有助于组织代码,将您正在做的两件事情分割开来:翻转100次并将条纹组合在一起。

代码语言:javascript
复制
# flip 100 times
flips = []
for _ in range(100):
    flips.append(flip())

# group together streaks:
first_flip, *rest_flips = flips
streaks = [[first_flip]]

for side in rest_flips:
    prev_streak = streaks[-1]  # [-1] returns the last item
    prev_side = prev_streak[-1]

    if side == prev_side:
        streak = prev_streak
    else:
        streak = []  # new streak
        streaks.append(streak)

    streak.append(side)

表示“更好”的代码

代码语言:javascript
复制
numberOfStreaks = 0 #author wrote this line

Python中的约定是对变量(即number_of_streaks )进行下划线命名。

在Python中,0是"fasley",这意味着flip()可以是:

代码语言:javascript
复制
    if random.randint(0, 1):
        return "H"  # when 1, "truthy"
    else:
        return "T"  # when 0, "falsey"

分组时,可以通过处理第一次迭代边缘情况,将所有翻转放在一起,而不是单独处理first_fliprest_flips

代码语言:javascript
复制
streaks = []
for side in flips:
    prev_side = streaks and streaks[-1][-1]  # `[]` is also falsey

    if side == prev_side:
        streak = streaks[-1]
    else:
        streak = []
        streaks.append(streak)

    streak.append(side)

调平

将翻转从分组中分离出来的原因之一是分组非常有用,它在标准库中已经可用,如itertools.groupby

代码语言:javascript
复制
import itertools as it

flips = [flip() for _ in range(100)]
streaks = [list(grp) for _, grp in it.groupby(flips)]
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/284825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档