Имеет ли последовательность, как 0, 94, 5, 1, 3, 4, 14, 8, 10, 9, 11, 6, 12, 7, 16, 15, 17, 19, 22, 21, 20, 13 , 18, 25, 24, 26, 29, 28, 31, 23, 36, 27, 42, 41, 30, 33, 34, 37, 35, 32, 39, 47, 44, 46, 40, 38, 50 , 43, 45, 48, 52, 49, 55, 54, 57, 56, 64, 51, 60, 53, 59, 62, 61, 69, 68, 63, 58, 65, 71, 70, 66, 73 , 67, 72, 79, 74, 81, 77, 76, 75, 78, 83, 82, 85, 80, 87, 84, 90, 89, 86, 96, 93, 98, 88, 92, 99, 95 , 97, 2, 91 (мод 100) хорошо выглядеть?
Это вывод небольшой программы ruby (пояснения приведены ниже):
#!/usr/bin/env ruby
require 'digest/md5'
$seed = 'Kind of a password'
$n = 100 # size of sequence
$k = 10 # mixing factor (higher means less clumping)
def pseudo_random_bit(k, n)
Digest::MD5.hexdigest($seed + "#{k}|#{n}")[-1] & 1
end
def sequence(x)
h = $n/2
$k.times do |k|
# maybe exchange 1st with 2nd, 3rd with 4th, etc
x ^= pseudo_random_bit(k, x >> 1) if x < 2*h
# maybe exchange 1st with last
if [0, $n-1].include? x
x ^= ($n-1)*pseudo_random_bit(k, 2*h)
end
# move 1st to end
x = (x - 1) % $n
# maybe exchange 1st with 2nd, 3rd with 4th, etc
# (corresponds to 2nd with 3rd, 4th with 5th, etc)
x ^= pseudo_random_bit(k, h+(x >> 1)) if x < 2*(($n-1)/2)
# move 1st to front
x = (x + 1) % $n
end
x
end
puts (0..99).map {|x| sequence(x)}.join(', ')
Идея в основном состоит в том, чтобы начать с последовательности 0..n-1 и нарушить порядок, пропустив k раз по последовательности (чем больше проходов, тем меньше комкование). В каждом проходе один сначала смотрит на пары чисел в позициях 0 и 1, 2 и 3, 4 и 5 и т. Д. (Общие: 2i и 2i + 1) и подбрасывает монету для каждой пары. Головки (= 1) означают обмен номерами в паре, хвосты (= 0) означают, что не обмениваются ими. Затем вы делаете то же самое для пар в позициях 1 и 2, 3 и 4 и т. Д. (Общие: 2i + 1 и 2i + 2). Поскольку вы упомянули, что ваша последовательность - мод 10, я дополнительно обменял позиции 0 и n-1, если монета для этой пары диктует это.
Одно число x может быть отображено по модулю n после того, как k проходит к любому числу интервала [x- k , x + k ] и составляет приблизительно бином, распределенный вокруг х. Пары (x, x + 1) чисел не модифицируются независимо.
В качестве генератора псевдослучайных данных я использовал только последний из 128 выходных битов хеш-функции MD5, вместо этого выберите любую функцию, которую вы хотите. Благодаря скоплению нельзя получить «безопасную» (= непредсказуемую) случайную последовательность.