【问题标题】:Comparing multiple coin flip experiments. 1 Experiment = 100 Flips. Trying to simulate 10 experiments比较多个硬币翻转实验。 1 次实验 = 100 次翻转。试图模拟 10 个实验
【发布时间】:2021-11-15 13:55:10
【问题描述】:
import random as rd

n = 0
ListOfStreaks = []
ListOfResults = []
while n != 10:
    numberOfStreaks = 0
    for i in range(100):
        Flip = rd.randint(0,1)
        ListOfResults.append(Flip)

    for i in range(96):
        count = 0
        for j in range(6):
            if ListOfResults[i] == ListOfResults[i + j]:
                count += 1
                if count == 6:
                    numberOfStreaks += 1
                    count = 0
                else:
                    continue
            else:
                break
    ListOfStreaks.append(numberOfStreaks)
    n += 1

print(ListOfStreaks)
print(len(ListOfResults))

在上面的代码中,我能够成功地掷硬币 100 次,并检查在 100 次翻转中连续出现 6 次正面或反面的次数。我无法正确设置代码以运行 10 次实验,以检查每个实验中正面或反面连续出现六次的次数。目标不是连续抛硬币 1000 次,而是连续抛 100 次硬币的 10 次实验。

该练习的重点是稍后能够模拟实验 10,000 次,以查看正面或反面在 100 次翻转中连续出现 6 次的概率。本质上,我试图收集足够的样本量。虽然有实际的统计/概率方法可以得到准确的答案,但这不是我想要关注的。

CoinFlip Code

【问题讨论】:

  • 如果您的代码为“单一实验”完成了您想要的操作,那么您最简单的方法是将其放入一个函数中并调用该函数 10 次。该函数应返回条纹数。

标签: python python-3.x coin-flipping


【解决方案1】:

您的关键问题似乎是您在 while 循环之外有 ListOfResults = [],因此每次运行都会向列表中添加另外 100 个条目,而不是设置新测试。

我已经用列表解析替换了最初的 for 循环,每次都会设置一个新样本。

import random as rd

list_of_streaks = []

for _ in range(10):
    list_of_results = [rd.randint(0,1) for _ in range(100)]
    number_of_streaks = 0
    for i in range(96):
        if sum(list_of_results[i: i+6]) in(0, 6):
            number_of_streaks += 1
    list_of_streaks.append(number_of_streaks)

print(list_of_streaks)
print(len(list_of_results))

您也不需要内部 for 循环来将所有 6 次翻转相加 - 您只需将它们相加即可查看总和是 6 还是 0。您似乎刚刚测试了正面 - 我测试了对于 6 次相同的翻转,无论是正面还是反面,但您可以轻松调整。

如果您要迭代一定数量的迭代,使用带范围的 for 循环也比带计数器的 while 循环要容易得多。

@JonSG 的第一条评论也值得注意。如果您将单独的测试设置为一个函数,您将不得不在函数中包含ListOfResults = [],因此您每次都会得到一个包含 100 个结果的新样本。比如:

import random as rd

def run_test():
    list_of_results = [rd.randint(0,1) for _ in range(100)]
    number_of_streaks = 0
    for i in range(96):
        if sum(list_of_results[i: i+6]) in(0, 6):
            number_of_streaks += 1
    return number_of_streaks

print([run_test() for _ in range(10)])
print(len(list_of_results))

【讨论】:

  • 我正在努力形象化/概念化为什么我的 ListOfResuts 具有相同的一组值。根据目前的结果,我将掷硬币 100 次,并将结果放入 ListOfResults 的十个槽中。
  • 因为您在 while 循环之外创建了 Empty ListOfResults,所以在 while 循环的第一次迭代中,您向其中添加 100 个随机值,然后检查前 100 个值是否存在条纹。在 while 循环的下一次迭代中,将 100 个新值附加到 ListOfResults 使其长度为 200,但随后迭代相同的前 100 个值以检查条纹。每次您在 ListOfResults 的末尾添加 100 个新值,但检查原始的 100 个值,因此您会得到 10 次相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多