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




псевдорандом python (3)

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

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

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

Любые советы высоко ценится.


Вы можете использовать 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

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

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


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

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

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

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

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

>>> 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

решил быть в то же время!







numbers