硬币翻转模拟存在问题。该代码应计算出一次掷硬币并连续三次获得尾巴所需的平均翻转次数(因此,成功= 3't',其中1次成功满足了第一个实验)。
import random
experiments = [1, 10, 100, 1000, 10000, 100000]
for number in experiments:
experiment = []
success = 0
while success < number:
face = random.choice(['h','t'])
experiment.append(face)
success = ''.join(experiment).count('ttt')
print(f'Experiments: {number}')
print(f'Average flips: {len(experiment)/success}\n')
输出看起来像这样:
[evaluate troubleshooting.py]
Experiments: 1
Average flips: 27.0
Experiments: 10
Average flips: 6.4
Experiments: 100
Average flips: 14.39
Experiments: 1000
答案 0 :(得分:1)
好吧,我认为主要的问题是success = ''.join(experiment).count('ttt')
行将导致您的程序在while循环中的每次运行中搜索整个列表,这将导致O(n ^ 2)时间复杂度(又名: ,BAD。如果您进行更多的实验,真的很糟糕。
我提出了一个(基本的)程序,它将在线性(O(n))时间中发挥作用:
import random
experiment_size = [1,10,100,1000,10000,100000]
for number in experiment_size:
last = False # track whether the last 3 flips were tails. False = don't care,
# True = tails
last_2 = False
last_3 = False
success = 0
runs = 0
while success < number:
runs += 1
last_3 = last_2 #bump the 3rd from last flip
last_2 = last
last = bool(random.getrandbits(1)) #get True or False, randomly
if(last & last_2 & last_3): #if all are tails
success += 1
last, last_2, last_3 = False, False, False #reset so that you have to get 3
#in a row again
print("Runs: " + str(runs) + "\nSuccesses: " + str(success) +"\nAverage: " + str(runs/success) + "\n")
因为我们不会在每次重复中遍历整个列表,所以速度要快得多。