如何计算x次尝试中特定条纹的概率?

2024-06-25 23:22:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个完全的编程初学者,这是我在这里遇到的第一个问题。:)

目前正在进行自动化的无聊的东西,我有麻烦得到一个解决方案的一个练习在第4章结束。我应该创建一个程序,首先运行10000次一个实验,在这个实验中,我会随机抛硬币100次,然后检查并计算6个正面或反面的概率百分比

这是我目前的尝试。这显然是有问题的,因为我得到了0,01%的返回,而“正确的解决方案”应该在1.5%左右。我知道关于同一主题已经有很多问题了,但我更感兴趣的是知道如何改进代码以及代码的错误,而不是找出完全不同的解决方案

import random

numberOfStreaks = 0

for experimentNumber in range(10000):
    list = [random.randint(0, 1) for i in range(100)]
    for i in list:
       if list[i] == list[i + 1] == list[i + 2] == list[i + 3]
        == list[i + 4] == list[i + 5]:
           numberOfStreaks += 1
print 'Chance of streak: %s%%' % (numberOfStreaks / 100)

我搞砸了什么


Tags: 代码in程序for编程range硬币random
2条回答

旁白:您可以在Python中使用_来更容易地表示大数字。这可能很有趣,因为您是python新手

我想我们讨论的是连续六次击中头部或尾部的概率。如果是这样,您可以这样实现:

streaks = 0
for attempt in range(10_000):
    attempt_outcome = [random.randint(0, 1) for i in range(100)]
    for i in range(len(attempt_outcome)-5):
        if sum(attempt_outcome[i:i+5]) == 0 or sum(attempt_outcome[i:i+5]) == 6:
            streaks +=1
            break
print("Probability: {}".format(streaks / 10_000))

这使我们得出以下结论:

>>> Probability: 0.8095

这意味着在10000次尝试中,有80.95%的尝试有一次或多次的连胜,超过六次


注意:我们在发现第一条条纹后将打破for循环,因为在我们的情况下,如果尝试结果中有多条条纹,我们不需要这些信息。这会影响我们的计算并导致错误的结果

实际上,您的代码中有几个错误:

  • 执行for i in list:操作时i将被分配给列表的元素,而不是索引
  • 如果你浏览了整个列表,那么当你访问list[i+5]时,你就有溢出的风险
  • 如果你发现一条长度为6的条纹,你应该停止研究该示例,转而研究下一个示例(否则一个示例可能会被计算多次)
  • 最终百分比需要计算为\u条纹数除以\u示例数(乘以100)

另外,我建议您避免使用关键字作为变量名(就像您使用list

以下是一个更正的版本(使用python3)

import random

number_of_streaks = 0
number_of_experiments = 10000

for _ in range(number_of_experiments):
    lst = [random.randint(0, 1) for _ in range(100)]
    for i in range(len(lst) - 5):
        if sum(lst[i : i + 6]) in (0, 6):
            number_of_streaks += 1
            break

print(f"Chance of streak: {number_of_streaks / number_of_experiments * 100:.2f}%")

结果表明,翻动100枚硬币时,很可能会出现长度为6的连击(大约80%)

相关问题 更多 >