Генератор списка случайных чисел не работает должным образом (Python) - PullRequest
1 голос
/ 17 января 2020

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

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

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 ]

2 голосов
/ 17 января 2020

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

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

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

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

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

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


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

0 голосов
/ 17 января 2020

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...