Требуется случайное значение из последних элементов x в списке - PullRequest
0 голосов
/ 13 февраля 2020

Входной список выглядит как li = [12,44,55,64,34,54,56,43,56,9,87,89]

Мне нужна функция, в которой я должен передать эти list и x в качестве входных данных и получить случайный элемент из последних x элементов в данном списке.

Например: val = getRandom(li, 4)

val должно быть любым из следующих значений: 56,9,87,89

Ответы [ 4 ]

4 голосов
/ 13 февраля 2020

Использовать random модуль

import random

li = [12,44,55,64,34,54,56,43,56,9,87,89]

def getRandom(ls, x):
    return random.choice(ls[-x:])

print(getRandom(li, 4))
3 голосов
/ 13 февраля 2020

Поскольку пока нет ответа, который не использует random модуль ... (Проверено на CPython 3.6, 3.7, 3.8)

Эта программа не использует импорт, выдает ( потенциально) удовлетворительный «случайный» результат. Помните, что ни один генератор случайных чисел не является идеальным, и этот, безусловно, не является выбором мусора, но опять же, нет импорта

s = 0
def randn(n):
    global s
    s += 1
    return hash(str(s)) % n

def get_random(sequence, n):
    i = randn(n) - n + len(sequence)
    return sequence[i]

li = [12,44,55,64,34,54,56,43,56,9,87,89]

print(get_random(li, 4))

Объяснение:

s = 0 это начальное состояние (начальное число) случайного алгоритма

global s; s += 1 это увеличивает состояние каждый раз, когда вызывается randn, поэтому мы не получаем одно и то же значение каждый раз, когда

hash(str(s)) встроенный hash создает int га sh данного объекта. Причина, по которой мы сначала конвертируем в строку, заключается в том, что ha sh из int напрямую (обычно) сам по себе. Хеши строк согласованы во время выполнения программы, но не при перезапуске программы (протестировано в CPython), поэтому даже начиная с s = 0 всегда, мы получим другой ряд чисел при перезапуске program.

% n мы рассматриваем результат ha sh как 1. псевдослучайный и 2. большой. Поэтому, если мы берем модуль на n, а n намного меньше, чем (большое) значение га sh, результатом должно быть псевдослучайное значение от 0 до n-1.

i = randn(n) - n + len(sequence) получить случайный индекс последних n индексов последовательности

3 голосов
/ 13 февраля 2020

Чтобы сделать это без копирования фрагмента списка, вы можете использовать random.randint(-x, -1) для создания индекса в диапазоне от -x до -1 включительно ( см. Документы ). Когда вы используете отрицательное число в качестве индекса, оно рассчитывается как смещение от конца списка.

1 голос
/ 13 февраля 2020

Возможно, вы могли бы попробовать этот подход:

     import random

     li = [12,44,55,64,34,54,56,43,56,9,87,89]

     val = random.choice(li[-4:])

, если вы напечатаете свой val, ответ должен быть одним из последних четырех чисел, например:

     89
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...