Хотя и для операторов, повторяющихся неверное количество раз - PullRequest
0 голосов
/ 27 октября 2018

Мой вопрос: почему это повторяется случайное количество раз вместо 100 раз?print (len(result)) был добавлен только для того, чтобы проверить, сколько итераций он фактически выполнил, и это всегда случайное число вместо 100 раз.

Я также пытался использовать for i in range(100), но оно также не работало.

# Die simulation

import random
min = 1 
max = 6

counter_1 = 0
counter_2 = 0
counter_3 = 0
counter_4 = 0
counter_5 = 0
counter_6 = 0

i = 0
result = []

while i < 100:
    if random.randint(min,max) == 1:
        print ("The die landed on 1.")
        counter_1 +=1
        result.append(1)

    elif random.randint(min,max) == 2:
        print ("The die landed on 2.")
        counter_2 +=1
        result.append(2)

    elif random.randint(min,max) == 3:
        print ("The die landed on 3.")
        counter_3 +=1
        result.append(3)

    elif random.randint(min,max) == 4:
        print ("The die landed on 4.")
        counter_4 +=1
        result.append(4)

    elif random.randint(min,max) == 5:
        print ("The die landed on 5.")
        counter_5 +=1
        result.append(5)

    elif random.randint(min,max) == 6:
        print ("The die landed on 6.")
        counter_6 +=1
        result.append(6)


    i +=1

print (result)
print (len(result))
print ("In a total of", 100, "number of simulations, The die landed on 1", counter_1, "times, landed on 2", counter_2, "times, landed on 3", counter_3 ,"times, ", end = '')
print ("landed on 4" , counter_4, "times, landed on 5", counter_5, "times, landed on 6", counter_6, "times.")

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Как Робин Зигмонд ответил : вы воссоздаете случайное число, поэтому ни одно из условий не может соответствовать.

Fix:

while i < 100:
    random_number =  random.randint(min,max)

    if random_number == 1:
        print ("The die landed on 1.")
        counter_1 +=1
        result.append(1)

    elif random_number == 2:
        print ("The die landed on 2.")
        counter_2 +=1
        result.append(2)

    elif random_number == 3:
        print ("The die landed on 3.")
        counter_3 +=1
        result.append(3)

    elif random_number == 4:
        print ("The die landed on 4.")
        counter_4 +=1
        result.append(4)

    elif random_number == 5:
        print ("The die landed on 5.")
        counter_5 +=1
        result.append(5)

    elif random_number == 6:            # else: would suffice
        print ("The die landed on 6.")
        counter_6 +=1
        result.append(6) 

    i +=1

Ваш симулятор смерти слишком сложен. random может генерировать список из 100 бросков кубиков одновременно. Вы можете использовать класс Counter для их легкого подсчета:

import random
min_value = 1  # min and max are already taken as names by built ins
max_value = 6

# create 100 random numbers 1 to 6 - range upper bound is exlusive, hence max_value+1
dices = random.choices(range(min_value,max_value+1), k= 100)

from collections import Counter

# create a dict that counts what dices happened how often
numbers = Counter(dices)
for die, count in  sorted(numbers.most_common()):
    print(f"Die {die} occured {count} times.")


print ("In a total of", 100, "number of simulations, The die landed on 1", 
       numbers[1], "times, landed on 2", numbers[2], "times, landed on 3", 
       numbers[3],"times, landed on 4" , numbers[4], "times, landed on 5",
       numbers[5], "times, landed on 6", numbers[6], "times.")

Выход:

Die 1 occured 13 times.
Die 2 occured 18 times.
Die 3 occured 15 times.
Die 4 occured 17 times.
Die 5 occured 20 times.
Die 6 occured 17 times.
In a total of 100 number of simulations, The die landed on 1 13 times, 
landed on 2 18 times, landed on 3 15 times, landed on 4 17 times, 
landed on 5 20 times, landed on 6 17 times.

Readup:

0 голосов
/ 27 октября 2018

Это верно. random.randint следует поместить один раз в цикл, как показано ниже:

import random
min = 1 
max = 6

counter_1 = 0
counter_2 = 0
counter_3 = 0
counter_4 = 0
counter_5 = 0
counter_6 = 0

i = 0
result = []

while i < 100:
    holder=random.randint(min,max)
    if holder == 1:
        print ("The die landed on 1.")
        counter_1 +=1
        result.append(1)

    elif holder== 2:
        print ("The die landed on 2.")
        counter_2 +=1
        result.append(2)

    elif holder == 3:
        print ("The die landed on 3.")
        counter_3 +=1
        result.append(3)

    elif holder == 4:
        print ("The die landed on 4.")
        counter_4 +=1
        result.append(4)

    elif holder == 5:
        print ("The die landed on 5.")
        counter_5 +=1
        result.append(5)

    elif holder == 6:
        print ("The die landed on 6.")
        counter_6 +=1
        result.append(6)


    i +=1

print (result)
print (len(result))
print ("In a total of", 100, "number of simulations, The die landed on 1", counter_1, "times, landed on 2", counter_2, "times, landed on 3", counter_3 ,"times, ", end = '')
print ("landed on 4" , counter_4, "times, landed on 5", counter_5, "times, landed on 6", counter_6, "times.")
0 голосов
/ 27 октября 2018

Проблема в том, что вы вызываете random.randint для каждой проверки if и elif - в результате возможно, что ни одна из проверок не пройдет, в результате чего в вашем конечном массиве будет меньше 100 номеров.Вы должны вызывать эту функцию только один раз за итерацию, сохранять результат в переменной и проверять это.

...