Python: бросить кубик 12 раз, рассчитать вероятность, если каждое число одинаково появляется дважды - PullRequest
0 голосов
/ 01 марта 2020

Я написал приведенный ниже код для подписанного вопроса, но результат возврата всегда равен 0. Может ли кто-нибудь помочь мне выяснить, в чем здесь проблема?

Большое спасибо!

import random
dice_sides = 6
frequency_list = []
def roll_dice(times):
    results = []
    for roll_num in range(times):
        result = random.randint(1,dice_sides)
        results.append(result)
    for i in range(dice_sides):
        if results.count(i) != 2:
            frequency = 0
            break
        else:
            frequency = 1
    return frequency
def occurrence(N,times):
    for j in range(N):
        frequency_list.append(roll_dice(times))
    prob = frequency_list.count(1)
    return prob

print(occurrence(10000,12))

1 Ответ

1 голос
/ 01 марта 2020

Вы можете попробовать что-то вроде этого

Код

import random
from collections import Counter



def roll_dice(n_sides, times):
    if n_sides % times:
        return 0

    results = []
    for roll_num in range(times):
        result = random.randint(1, n_sides)
        results.append(result)

    # I'm using set here and will check its length,
    # Counter(results) returns a dict of items (item, count)
    # and if every item has the same count it should have length 1. 
    # More generic statement not only for (2 in this case)
    res_dict = set(Counter(results).values())

    if len(res_dict) == 1:
        return 1
    return 0


def mean(ar):
    return sum(ar)/len(ar)


def occurrence(N, n_sides, times):
    frequency_list = []
    for j in range(N):
        frequency_list.append(roll_dice(n_sides, times))
    prob = mean(frequency_list)
    return prob


if __name__ == '__main__':
    N = 100000 # I intentionally made it 100k 
    n_sides = 6
    times = 12

    res_prob = occurrence(N, times)
    print(res_prob)

Выход

0.00604
[Finished in 3.6s]
...