2012-06-19 2 views
1

Я хочу генерировать случайные целые числа между 0-9 (включительно на обоих концах), но я хочу убедиться, что он не часто генерирует одинаковое число последовательно. Я планирую использовать функцию randint от модуля random. Но я не уверен, что это будет удобно. Как часто random.randint генерировать одинаковый номер?Как часто random.randint генерирует одинаковое число?

+7

Предполагая, что это достаточно случайным образом, вероятность того, чтобы получить такое же количество в два раза 10%. – georg

ответ

4

Почему бы не завернуть randint?

class MyRand(object): 
    def __init__(self): 
     self.last = None 

    def __call__(self): 
     r = random.randint(0, 9) 
     while r == self.last: 
      r = random.randint(0, 9) 
     self.last = r 
     return r 

randint = MyRand() 
x = randint() 
y = randint() 
... 
+0

Вау, я полностью пропустил * избегая повторного, последовательного поколения * части вопроса, +1. –

+0

Тем не менее, я чувствую, что генератор является более элегантным решением здесь. –

3

Где the Python docs скажите случайный, вы можете предположить, что они означают равномерное случайное значение, если не указано иное (то есть все возможные исходы имеют равную вероятность).

Для генерации чисел без последовательных чисел генерируется, самый простой вариант, чтобы сделать свой собственный генератор:

def random_non_repeating(min, max=None): 
    if not max: 
     min, max = 0, min 
    old = None 
    while True: 
     current = random.randint(min, max) 
     if not old == current: 
      old = current 
      yield current 
2

Чтобы избежать дубликатов вы можете использовать простую оболочку, как это (см Fisher–Yates для объяснения того, как это работает):

def unique_random(choices): 
    while True: 
     r = random.randrange(len(choices) - 1) + 1 
     choices[0], choices[r] = choices[r], choices[0] 
     yield choices[0] 

Пример использования:

from itertools import islice 
g = unique_random(range(10)) 
print list(islice(g, 100)) 
+0

Мне не кажется естественным использовать генератор для получения случайного числа. – robert

+0

Зачем вы проходите мимо 'islice' 100? Если вы хотите, чтобы он прошел до конца, просто передайте «Нет». –

+0

@robert Почему бы и нет? Это хороший генератор. –

2

Это легко выполняется без петли while.

next_random_number = (previous_random_number + random.randint(1,9)) % 10 
+0

Это такой аккуратный и эффективный способ сделать это. – neil

-1
list =[] 
x=0 
for i in range(0,10): 
    while x in list: 
     x=random.randint(500,1000) 
    list.append(x) 
print sorted(list, key=int) 
+0

Пожалуйста, объясните свой ответ. [Из обзора] (http://stackoverflow.com/review/first-posts/10627659). – Alex

+0

Привет, U может использовать список для генерации случайных чисел, а не дублировать –

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

  • Нет связанных вопросов^_^