2013-12-10 3 views
-1

Это мой код:Python генерации случайных чисел

import random 
minimum=int(input("Enter minimal value: ")) 
maximum=int(input("Enter maximum value: ")) 
howMany = int(input("How many numbers do you want to generate?")) 
sum=0 
n=1 
while n<=howMany: 
    num=random.randrange(minimum,maximum) 
    num+=sum 
    num+=1 
    print(num) 
print("Python's random average between", minimum, "and", maximum, "is", sum/howMany*100) 

Проблема заключается в том, что когда пользователь вводит сумму чисел они хотят сгенерированных, он не говорит ничего и питон не делает ничего. Он просто замерзает. Что не так с моим кодом? Кроме того, как бы я вычислил среднее значение? В среднем я получаю 0,0.

+6

'num + = 1' должно быть' n + = 1' – BartoszKP

+3

Гораздо проще использовать 'for _ in range (howMany):', то вы не можете забыть увеличивать – jonrsharpe

ответ

1

Increment n вместо num и sum должен быть увеличен на величину num

while n<=howMany: 
    num=random.randrange(minimum,maximum) 
    sum += num 
    n += 1 
    print(num) 

Кроме того, чтобы найти среднее использование sum/howMany вместо sum/howMany*100

3

Могу ли я рекомендую использовать петлю for .. in, чтобы избежать их типы логических ошибок?

import random 
minimum=int(input("Enter minimal value: ")) 
maximum=int(input("Enter maximum value: ")) 
howMany = int(input("How many numbers do you want to generate?")) 
total=0 
for n in range(howMany): 
    num=random.randrange(minimum,maximum) 
    total+=num 
    print(num) 
print("Python's random average between", minimum, "and", maximum, "is", total/howMany*100) 

В самом деле, это сводит меня с ума, когда я должен использовать обычный for цикл на других языках.

Также обратите внимание, что это должно быть sum+=num, а не num+=sum. a += b - это то же самое, что и a = a + b - это левая сторона, которая изменяется.

+0

Как насчет 'total' вместо этого - так встроенная 'сумма' не затенена для сюрпризов позже ... –

+0

Если OP использует 3, нет' xrange'. – DSM

+0

хорошие комментарии, обе. обновленный – Claudiu

1

Я предлагаю использовать встроенную функцию sum в выражении генератора, а не добавлять ваши случайные значения вручную. Это немного более продвинутый, чем то, что вы используете, но это одна из вещей, что Python действительно хорошо:

import random 

minimum=int(input("Enter minimal value: ")) 
maximum=int(input("Enter maximum value: ")) 
howMany = int(input("How many numbers do you want to generate?")) 

total = sum(random.randint(minimum, maximum) for _ in range(howMany)) # do the sum 

avg = total/howMany # compute the average 

# print the output 
print("Average of {} random numbers between {} and {} is {:.2}".format(howMany, minimum, 
                     maximum, avg)) 

Я делаю несколько других вещей, по-другому тоже. Для начала я использую имя total для суммы случайных чисел, чтобы не затенять встроенную функцию sum. Допускается изменение существующего имени, но обычно это плохая идея (это может привести к ошибкам). Поскольку я использую функцию sum, было бы очень сложно использовать sum в качестве имени переменной.

В выражении генератора внутри sum вызова, я также использую randint, а не randrange, потому что она включает в себя максимальное значение (randrange исключает максимум, как range делает). Я думаю, что это лучше соответствует описанию «между minimum и maximum», что предполагает (по крайней мере, мне), что конечные точки должны обрабатываться симметрично. Если вы используете свои случайные числа для какой-либо другой цели, вы должны быть осторожны, чтобы функция, которую вы вызываете, соответствовала вашей пользе, или вы можете получить трудно найти ошибки.

Я также использую форматирование строк для получения результата, а не для передачи нескольких значений до print. Это позволяет гораздо более гибко форматировать, если вы этого хотите. Я использую эту гибкость, чтобы ограничить среднее значение до двух знаков после запятой, а не по умолчанию Python (что часто является всей точностью, доступной для числа с плавающей запятой, около 16 знаков после запятой).

0

Если скорость является проблемой.вы могли бы сделать:

import numpy as np 
total = np.random.random_integers(minimum, maximum, size=(howMany)).sum() 

что примерно в 100 раз быстрее, чем

total = sum(random.randint(minimum, maximum) for _ in range(howMany)) 
0

Здесь ни n ни howMany не обновляется внутри цикла и поэтому условие всегда остается истинным дает бесконечный цикл.

Обновить либо n или уменьшить howMany значение.

Смежные вопросы