Изменение моего кода для запуска этой программы "n" раз - PullRequest
0 голосов
/ 02 апреля 2020

Мне нужно было написать программу, которая вычисляла бы вероятность того, что, если я брошу кости 12 раз, каждое число на кости появится хотя бы один раз. Был предложен вопрос, что там 6 человек, и мы все решили показывать объявление ie один раз в месяц в течение года. Тот, кто наберет их номер, выберет ресторан. Какова вероятность, что каждый сможет выбрать свой ресторан хотя бы один раз. Поэтому я написал программу, которая будет бросать кости 12 раз и отслеживать результат. Если каждое число в моем случайном методе выходит, это означает, что у каждого есть шанс выбрать ресторан (Успех). Если одно из чисел остается равным нулю в наборе из 12 роллов, это означает, что не каждый может выбрать ресторан (неудача). Моя программа прекрасно работает и запускается, когда пользователь вводит «roll», и завершает работу, если пользователь вводит «Q». Он отслеживает успехи и делит на то, сколько раз программа запускалась. Я начал с очень простой программы d ie roll, которая запускается некоторое время l oop, а затем собрал всю функциональность оттуда. В конце я понял, что мне нужно, чтобы моя программа запускалась 100 или 1000 раз, чтобы найти хорошую среднюю вероятность. Я не лучший кодер, как я полагаю, вы можете видеть из моего кода, но я закодировал себя в угол и хочу иметь возможность запускать это "n" раз, не тратя часы, пытаясь понять это. Я уверен, что лучшие программисты смогут мне очень легко помочь. Заранее спасибо. Вот мой код.

import random

global success
success = 0
global eachturn
eachturn = 0


def main():
    rolling = True
    while rolling:
        roll_again = input("Ready to roll? ENTER=Roll. Q=Quit. ")
        if roll_again.lower() != "q":
            global chance
            global result
            global n1
            global n2
            global n3
            global n4
            global n5
            global n6
            n1 = n2 = n3 = n4 = n5 = n6 = 0
            droll = 1
            result = 0
            for number in range(1, 13):
                result = random.randint(1, 6)
                print("Roll {0} = {1}".format(droll, result))
                droll += 1
                counter()
            print(
                "\n---- Stats: ----\nTimes number one appeared: {}\nTimes number two appeared: {}\n"
                "Times number three appeared: {}\nTimes number four appeared: {}\nTimes number five appeared: {}\n"
                "Times number six appeared: {}".format(
                    n1, n2, n3, n4, n5, n6))
            iszero()
            turncounter()
            print("This increments when all numbers 1-6 are part of the 12 roll outcome:")
            print(success)
            print("The amount of times the program is run (12 rolls of a dice):")
            print(eachturn)
            print("This is the success divided by the number of program runs:")
            print(success/eachturn)

        else:
            rolling = False

    print("Thanks for playing.")


def counter():
    global result
    global n1
    global n2
    global n3
    global n4
    global n5
    global n6
    if result == 1:
        n1 += 1
    elif result == 2:
        n2 += 1
    elif result == 3:
        n3 += 1
    elif result == 4:
        n4 += 1
    elif result == 5:
        n5 += 1
    elif result == 6:
        n6 += 1
    else:
        print("droll = {}".format(result))
        return None


def iszero():
    global zero
    global success
    zero = 0
    if n1 == 0:
        return zero
    elif n2 == 0:
        return 0
    elif n3 == 0:
        return 0
    elif n4 == 0:
        return 0
    elif n5 == 0:
        return 0
    elif n6 == 0:
        return 0
    else:
        zero += 1
        success += 1
        return zero


def turncounter():
    global eachturn
    eachturn += 1


main()

Вот пример выходных данных при запуске 1 раз. Однако, когда я набираю «бросить» несколько раз, он правильно увеличивается, давая мне (успех / (количество прогонов))

enter image description here

Пожалуйста, помогите мне выяснить, как запустить это "п" раз. Полагаю, мне нужно удалить свое время l oop, может быть, или есть более простой способ сделать это, не меняя слишком много?

1 Ответ

0 голосов
/ 02 апреля 2020

Здесь есть несколько вещей. Во-первых, на ваш конкретный вопрос c вы можете просто изменить свой l oop, чтобы вместо проверки ввода в main() вы просто l oop фиксировали число раз. Вы можете сделать это с чем-то вроде:

def main():
    for round in range(1000):
        global chance
        global result
        global n1
        ...
        print("This is the success divided by the number of program runs:")
        print(success/eachturn)

Тем не менее, это абсолютно огромный объем кода для чего-то, что может быть всего лишь несколькими строками:

In [51]: def run():
    ...:     return len({random.randint(1, 6) for _ in range(12)}) == 6
    ...:

In [52]: sum([run() for _ in range(10000)]) / 10000
Out[52]: 0.4287

Каждый вызов run генерирует 12 случайных чисел от 1 до 6 и сохраняет их в set (что устраняет дубликаты). Затем он проверяет, что все 6 присутствуют, возвращает True, если так, и False, если нет. Затем вы можете просто позвонить run() 10000 раз, суммировать значения (поскольку Python будет обрабатывать True как 1), а затем разделить на число прогонов, чтобы получить оценку вероятности.

Даже в этом случае Кроме того, вы можете улучшить то, что имеете, отказавшись от использования глобальных переменных и использования структур данных, таких как list s или dict s, для хранения значений вместо отдельных целочисленных значений и т. п., но это отдельное обсуждение.

...