Я прочитал пару постов здесь о генерации случайной последовательности без повторов (например Create Random Number Sequence with No Repeats) и решил реализовать его для моей собственной потребностиГенерация случайной последовательности без каких-либо повторов
На самом деле это был алгоритм применения некоторых не- деструктивные (обратимые) операции с битами текущего счетчика, чтобы получить псевдослучайное число, которое должно появляться только один раз. Поскольку операции обратимы, разные номера источников будут давать разные номера результатов.
Существует по меньшей мере несколько операций, таких как обмен двумя битами, инвертирование бит, циклический сдвиг. Если мы используем только упомянутые, качество последовательности не будет большим, поскольку соседний счетчик даст результаты с одинаковым количеством нулей и единиц. Реальный игровой чейнджер был xor один бит другим бит. Теперь последовательности выглядит намного лучше, но вопросы:
- Есть наименьшее подмножество операций, которые будут достаточно (например, инвертировать бит + исключающего бит другим бит) и добавление любого другого просто сделает алгоритм труднее читать, не давая никаких дополнительных преимуществ
- Как я могу приблизительно угадать количество операций для данного диапазона, чтобы последовательность была достаточно хорошей. Например, 200 операций для чисел от 0 до 31 дают визуально хорошие результаты, но 200 операций для диапазона 0..199 иногда дают блоки близких чисел.
- Есть ли алгоритм или набор тестов для тестирования таких последовательностей. Я знаю и использую, как только комплекты, которые могут тестировать общие случайные последовательности, но это другое, поэтому, вероятно, необходим какой-то специальный набор или, по крайней мере, некоторая конверсия обратно в общий случайный мир.
ОБНОВЛЕНИЕ: Поскольку я опубликовал в комментарии здесь есть уже такой генератор: AES Encryption, но, к сожалению, его можно использовать только для 128-битных диапазонов.
Благодаря
Max
Возможно, это не алгоритм BEST [править], но вы должны искать что-то подобное (например, чтобы перетасовать колоду). –
Не могли бы вы определить «Не лучше». Я думаю, что это решение обладает свойством выбора любой произвольной перестановки с равномерной вероятностью. Там могут быть более быстрые решения или могут быть решения, которые используют меньшее количество случайных бит, но я сомневаюсь в этом. – user485440
Спасибо, но на самом деле я хотел реализовать что-то, что можно было бы использовать для любых диапазонов, даже тех, которые, вероятно, потребуют много места для подхода к массиву. На самом деле, AES-шифрование - это такой генератор, который связывает уникальный вход с не повторяющимся выходом, но ограничен 128-битным диапазоном, мне просто нужен какой-то подобный алгоритм, но работающий для любого диапазона бит. – Maksee