2016-10-18 4 views
-1

Мне нужно написать скрипт, который генерирует случайные числа между 1-257000 и останавливается, когда возникает определенное число, рассказывающее мне, сколько чисел оно сгенерировано до сих пор.Как я могу сделать этот останов цикла с определенной переменной?

я сведущих, чтобы получить это далеко, но не могу показаться, чтобы получить его, чтобы остановить или рассчитывать

x=1 
while x < 257000: 
    import itertools 
    import random 

    def random_gen(low, high): 
     while True: 
      yield random.randrange(1, 257000) 

    gen = random_gen(1, 100) 
    items = list(itertools.islice(gen, 10)) 

    print items 
    x = x+1 

Большое вам спасибо за вашу помощь

+1

Почему вы создаете функцию в то время цикла и повторно импортировать? random_gen принимает два аргумента, которые вы никогда не используете, и у вас нет условия break, так что вы ожидаете, что такое * определенное число *? –

+1

Я вижу, что вы только что скопировали/вставляли из http://stackoverflow.com/a/22842533/2141635, вы должны попытаться понять код вместо слепого копирования/вставки, а затем заставить других отображать код для вас. –

+0

ваш разрыв цикла до x; если x равно 25700, ваш цикл прерывается. поэтому не считалось, что если определенное число порождает цикл, закончен. так что вы ожидаете до тех пор, пока x = 25700 и ваш кодовый останов –

ответ

2

Хух. Несколько недостатков (или, по крайней мере, неясных точек) в вашем коде.

  1. Вы запускаете свою петлю максимум 257000 раз. Хотя вероятность низкая, есть вероятность, что вы не нажмете число, которое вы ищете в цикле.

  2. Извлеките свои import заявления из вашей петли, не нужно проверять загружаемые модули python каждый раунд.

  3. Вы используете генератор для выбора списка (randrange), где вы можете просто позвонить randint().

  4. Вы определяете замкнутую функцию внутри цикла, которая создает новую функцию по новому адресу памяти каждый раунд.

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

Очень простой и прямой реализации вашей описанной проблемы может быть:

import random 
num = 0 # Our counter 
certain_number = 123456 # The number we seek 

while True: # Run until we break 
    # Increment for each new step 
    num += 1 

    # Generate a single number from the given range 
    random_number = random.randint(1, 257000) 

    if random_number == certain_number: 
     # Break if we hit it 
     break 

print('Hit after {} tries.'.format(num)) 

>>> Hit after 382001 tries. 
0

Во-первых, положить ваши import заявления и ваши функции definitons вне ваше время контуром. Это супер избыточное.

>>> def random_gen(low,high): 
... while True: 
...  yield random.randrange(low,high) 
... 
>>> lucky = 7 
>>> rg = random_gen() 
>>> rg = random_gen(1,1000)     
>>> next(itertools.dropwhile(lambda t: t[1] != lucky, enumerate(rg, 1))) 
(811, 7) 
>>> 

Вот еще один прогон, просто для удовольствия:

>>> rg = random_gen(1,257000) 
>>> n,L = next(itertools.dropwhile(lambda t: t[1] != lucky, enumerate(rg, 1))) 
>>> n 
22602 
>>> L 
7 
>>> 
+0

Вам нужно будет объяснить свой код, поскольку OP на самом деле не написал код в вопросе, чтобы они больше не имели представления о том, что происходит. –

+0

@PadraicCunningham Конечно, если OP использует генераторы, тогда они поймут этот код. Они не просто слепо копируют и вставляют код и вставляют его в цикл while случайно! –

+2

Удаление аргументов из 'random_gen' сделает' rg = random_gen (1,1000) 'fail – Holloway

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