Как генерировать случайные числа, которые отличаются?

Возможный дубликат:
выберите N предметов произвольно

Мне нужно сгенерировать 6 случайных чисел от 1 до 49, но они не могут быть одинаковыми. Я знаю, как сделать их случайными, я просто не уверен, как обеспечить, чтобы они были разными.

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

Приветствуются любые советы.

Ответ 1

Вы можете использовать random.sample:

>>> random.sample(xrange(1,50), 6)
[26, 39, 36, 46, 37, 1]

"Рабочий лист рекомендует отображать каждый номер и устанавливать его на ноль, но я не вижу, как это поможет".

Предполагая, что это назначение, и вам нужно реализовать выборку самостоятельно, вы можете посмотреть, как random.sample реализовано. Это действительно информативно, но может быть слишком сложным для ваших нужд, так как код также гарантирует, что все суб-срезы также будут действительными случайными выборками. Для эффективности он также использует разные подходы в зависимости от размера населения.

Что касается рабочего листа, я полагаю, он предполагает, что вы начинаете с списка чисел от 1 до 49 и предлагает заменить номера, которые вы выбрали с помощью 0, поэтому их можно пропустить, если они переустановлены. Вот несколько псевдокодов, чтобы вы начали:

population = range(1, 50)  # list of numbers from 1 to 49
sample = []
until we get 6 samples:
  index = a random number from 0 to 48  # look up random.randint()
  if population[index] is not 0:  # if we found an unmarked value
    append population[index] to sample
    set population[index] = 0  # mark selected

Если вы хотите попробовать что-то другое, существует много других подходов к рассмотрению, например. рандомизация списка, затем усечение, или некоторая форма выборки коллектора.

Удачи с вашим заданием.

Ответ 2

A set не будет содержать дубликатов:

s = set()
while len(s) < 6:
    s.add(get_my_new_random_number())

Ответ 3

Это очень распространенный и глупый вопрос интервью, вот его решение/алгоритм:

import random
a = range(1,50)
for i in xrange(6):
    b = a[random.randint(0,len(a)-i)]
    a.remove(b)
    print b

Для людей, заботящихся об эффективности, здесь находится тестовый стенд моего решения и Chin's:

>>> random.sample(xrange(1,50), 6)
[26, 39, 36, 46, 37, 1]

Результаты:

>python -mtimeit -s'import try2'
[38, 7, 31, 24, 30, 32]
100000000 loops, best of 3: 0.0144 usec per loop
>python -mtimeit -s'import try1'
36
26
41
31
37
14
100000000 loops, best of 3: 0.0144 usec per loop

решил быть одним и тем же!