Генератор списка случайных чисел не работает должным образом (Python)

Я сделал программу, которая предназначена для печати списка чисел, выбранных случайным образом из массива чисел, без повторения какого-либо числа.

Например, я ожидал следующего:

number_list(180, 222, 5)
219, 180, 185, 191, 197, 

Но результаты, которые дала мне моя программа, похожи, и сгенерированные числа всегда близки к экстремальным значениям массива (180 и 222). Например:

219, 180, 182, 181, 184, 
221, 181, 180, 183, 184,
219, 221, 222, 180, 181,
222, 219, 181, 180, 182, 

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

Код, который я использовал, выглядит следующим образом:

from random import randint

def number_list(start, end, length):
    tot_list = []
    for i in range(start, end+1):
        tot_list.append(i)
    list_len = len(tot_list)
    while(length > 0):
        index = start - randint(start-1, start + length-1)
        length = length -1
        number = tot_list[index]
        tot_list.remove(number)
        print(str(number) + ", ")

number_list(180, 222, 5)

Всего 2 ответа


Вы очень конкретно не берете число случайным образом из оставшегося списка:

    index = start - randint(start-1, start + length-1)

Вы путаете значения с индексами здесь и ниже. В приведенном вами примере это ищет случайное число с пределами 179 - 184 и вычитает его из начального значения, чтобы получить индекс в вашем списке. Это дает вам числа в диапазоне от -start + 1 до 1 ... или от -4 до 1 в этом примере. Это в конце вашего списка выбора.

Я легко нашел проблему с основной отладкой:

    print("TRACE", start, length, index, number, tot_list)

Смотрите этот прекрасный блог отладки за помощью. Вставьте полезные операторы вывода для отслеживания потока управления и данных. Удалить неприменимый код; уменьшить рабочий код до жестко запрограммированного результата. Как говорится в правилах размещения сообщений, «сделайте так, чтобы другие могли вам помочь».


Также обратите внимание, что для функции random уже есть функция: sample .


Основная проблема с вашей текущей логикой заключается в выборе индекса. Собственно, ваше утверждение:

index = start - randint(start-1, start + length-1)

Было бы много смысла, если бы length была фактической длиной tot_list . Но это не так, поскольку length в вашем коде отражает количество случайных чисел, которые вы хотите вернуть (5 в данном случае).

Поэтому в приведенной выше строке кода рассмотрите возможность замены length на фактическую длину списка, а именно end - start + 1 :

index = start - randint(start-1, start + end - start) # -1 + 1 cancel out

Примечание: если серьезно, зачем изобретать велосипед, когда вы можете использовать:

random.choices(range(180, 225), k=5)

Есть идеи?

10000