58 lines
1.2 KiB
Python
58 lines
1.2 KiB
Python
import random
|
|
import time
|
|
import sys
|
|
|
|
DEBUG=False
|
|
|
|
def roll_until_n_success(n, p_success=0.5):
|
|
|
|
successes = 0
|
|
tries = 0
|
|
|
|
faces = [0, 1]
|
|
weights = [p_success, (1 - p_success)]
|
|
|
|
while successes < n:
|
|
if (random.choices(faces, weights, k=1)[0] == 0):
|
|
successes += 1
|
|
tries += 1
|
|
|
|
return tries
|
|
|
|
def simulate(num_trials, n, p_success=0.5):
|
|
sum_trials = 0
|
|
|
|
sys.stdout.write(f"Trials\t\t\tAverage Rolls\n")
|
|
|
|
for i in range(num_trials):
|
|
sum_trials += roll_until_n_success(n, p_success)
|
|
if DEBUG: print(f"[DEBUG] sum_trials: {sum_trials}")
|
|
ave_trials = sum_trials / (i+1)
|
|
ave_trials_percent = ave_trials
|
|
|
|
# Clear line and move cursor to the beginning
|
|
sys.stdout.write('\033[2K\033[0G')
|
|
sys.stdout.write(f"({i+1}/{num_trials})\t{ave_trials_percent}%")
|
|
sys.stdout.flush()
|
|
|
|
sys.stdout.write("\n")
|
|
|
|
|
|
def main():
|
|
|
|
program_name = sys.argv[0]
|
|
|
|
if len(sys.argv) != 2:
|
|
print(f"Usage: {program_name} <number of trials>")
|
|
return 1
|
|
|
|
num_trials = int(sys.argv[1])
|
|
|
|
random.seed()
|
|
|
|
simulate(num_trials, 7, 0.5)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |