Я хочу генерировать случайные целые числа между 0-9 (включительно на обоих концах), но я хочу убедиться, что он не часто генерирует одинаковое число последовательно. Я планирую использовать функцию randint
от модуля random
. Но я не уверен, что это будет удобно. Как часто random.randint
генерировать одинаковый номер?Как часто random.randint генерирует одинаковое число?
ответ
Почему бы не завернуть 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()
...
Вау, я полностью пропустил * избегая повторного, последовательного поколения * части вопроса, +1. –
Тем не менее, я чувствую, что генератор является более элегантным решением здесь. –
Где 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
Чтобы избежать дубликатов вы можете использовать простую оболочку, как это (см 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))
Мне не кажется естественным использовать генератор для получения случайного числа. – robert
Зачем вы проходите мимо 'islice' 100? Если вы хотите, чтобы он прошел до конца, просто передайте «Нет». –
@robert Почему бы и нет? Это хороший генератор. –
Это легко выполняется без петли while.
next_random_number = (previous_random_number + random.randint(1,9)) % 10
Это такой аккуратный и эффективный способ сделать это. – neil
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)
Пожалуйста, объясните свой ответ. [Из обзора] (http://stackoverflow.com/review/first-posts/10627659). – Alex
Привет, U может использовать список для генерации случайных чисел, а не дублировать –
Предполагая, что это достаточно случайным образом, вероятность того, чтобы получить такое же количество в два раза 10%. – georg