Поскольку пока нет ответа, который не использует 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
индексов последовательности