2013-09-02 5 views
3

Предположим, что я неоднократно генерировал случайные целые числа от 0-9 до тех пор, пока не будет выдано заданное число. Мне нужна функция, которая подсчитывает, сколько целых чисел генерируется до тех пор, пока это не произойдет. Пожалуйста, помогите мне с этим.Подсчет случайных чисел

Это то, что я пробовал, я поставил 1000, потому что он достаточно большой, но я не думаю, что это правильно, потому что мой номер может прийти после 1000 итераций.

for i in range(1000): 
    d = randint() 
    if d <> 5: 
    cnt = cnt + 1 
    if d == 5: 
    break 
+0

Вместо симулирования вы можете просто попробовать один раз из [геометрического распределения] (http://en.wikipedia.org/wiki/Geometric_distribution) с вероятностью 0,1. –

ответ

10

Пусть номер, который вы ожидаете:

sum(1 for _ in iter(lambda: randint(0, 9), 5)) 

Вы можете добавить , если хотите включить последний номер.

Объяснение:

  • iter(function, val) возвращает итератор, который вызывает function до val не возвращается.
  • lambda: randint(0, 9) есть функция (можно называть) это возвращениеrandint(0, 9).
  • sum(1 for _ in iterator) вычисляет длину итератора.
+10

Я не думаю, что генераторные выражения и анонимные функции действительно находятся в понимании ОП, если он все еще борется с циклами. – Blender

+0

В чем смысл «_»? – John

+0

Это просто переменная, вы можете переименовать ее так, как хотите. См. Мой отредактированный ответ. – elyase

0

Это должно работать:

from random import randint 
# Make sure 'cnt' is outside the loop (otherwise it will be overwritten each iteration) 
cnt = 0 
# Use a while loop for continuous iteration 
while True: 
    # Python uses '!=' for "not equal", not '<>' 
    if randint(0, 9) != 5: 
     # You can use '+=' to increment a variable by an amount 
     # It's a lot cleaner than 'cnt = cnt + 1' 
     cnt += 1 
    else: 
     break 
print cnt 

или в виде функции:

from random import randint 
def func(): 
    cnt = 0 
    while True: 
     if randint(0, 9) != 5: 
      cnt += 1 
     else: 
      break 
    return cnt 
9

Несколько вещей:

  • Если вы хотите, чтобы ваш цикл продолжать, пока вы не остановите его, используйте while петлю вместо for петли.
  • Вы должны использовать != как оператор неравенства вместо <>.

Вот что-то, чтобы вы начали:

import random 

count = 0 

while True: 
    n = random.randint(0, 9) 
    count += 1 

    if n == 5: 
     break 

Вы могли бы также написать:

import random 

count = 1 
n = random.randint(0, 9) 

while n != 5: 
    count += 1 
    n = random.randint(0, 9) 

Преобразование его в функцию оставляется в качестве упражнения для читателя.

+1

Ваши ответы (как и собственный код OP) отключены на единицу, если они предполагают подсчет количества случайных целых чисел. – martineau

+1

'<>' используется в pre-python 3 и заменяется синтаксическим анализатором '! ='. –

+0

@ Sp .: Спасибо, я этого никогда не знал. Я думал, это было только для pre-2.6. – Blender

2

itertools.count часто аккуратнее, чем при использовании времени цикла с явным счетчиком

import random, itertools 

for count in itertools.count(): 
    if random.randint(0, 9) == 5: 
     break 

Если вы хотите счетчик, чтобы включать в себя итерацию, который генерирует 5, просто начать отсчет на 1 с помощью itertools.count(1)

1
from random import randint 
count = 0 
while randint(0, 9) != 5: 
    count += 1 
Смежные вопросы