Что гарантирует Random (int seed)?
Я работаю над проектом, который полагается присваивать пользователям случайные (ничего необычного, равномерно) подмножества большего набора. Каждый пользователь имеет уникальный идентификатор из набора, изоморфного целым числам. Насколько мне известно, есть два подхода.
- Создайте таблицу соединений базы данных между пользователями и ключевыми элементами вышеупомянутого большего набора с некоторой функцией один раз для каждого пользователя. Это может быть несколько непрактично для моих нужд, поэтому я бы предпочел...
- Во время выполнения определите подмножество с помощью аналогичной функции, но используйте уникальный идентификатор пользователя в качестве начального значения и просто установите его в памяти. В следующий раз, когда он понадобился, он был создан снова, из большего набора.
Итак, мой вопрос: если я использую объект .NET Random для создания второй функции с использованием идентификатора пользователя в качестве начального значения, гарантирует ли Microsoft не изменять алгоритм Random в будущем? То есть все новые последовательности Random (n) Next() будут неизменными на всех машинах
В качестве альтернативы я мог бы создать свой собственный генератор случайных чисел и упаковать его с помощью моего кода. Фактически, это то, что я, вероятно, сделаю, но мне все еще интересно узнать ответ.
Ответы
Ответ 1
Microsoft не может гарантировать, что их код никогда не изменится, поскольку улучшение кода происходит при выявленных уязвимостях, проблемах или товарах, - но пока, код не изменился, и если вы не меняете рамки на курсе, вы всегда должны иметь одинаковую функциональность.
Так что считайте, что он не изменится... но когда вы решите обновить свою фреймворк, убедитесь, что он по-прежнему работает одинаково.
Ответ 2
Нет, явно не гарантировано для совместимости между версиями:
Реализация генератора случайных чисел в классе Random не гарантируется на том же уровне в основных версиях .NET Framework. В результате ваш код приложения не должен предполагать, что одно и то же семя приведет к той же псевдослучайной последовательности в разных версиях .NET Framework.
Ответ 3
Вы можете использовать очень большое простое число для генерации последовательности чисел, которая кажется довольно случайной, и она всегда будет такой же:
p = VeryLargePrimeNumber
q = любое число меньше p (но не слишком мало)
Итерация такова:
n = (n * q)% p
первое n - это семя.
Может быть, какой-то метод криптографии будет лучше подходит...
т.е. каждая итерация вы создаете сигнатуру семенных бит,
и следующей итерацией вы подписываете предыдущую подпись,
и т.д.
Ответ 4
Учитывая, что контекст остается тем же самым -— то есть базовый код не изменяется — сеяние генератора псевдослучайных чисел с фиксированным значением n должно заставить генератор генерировать точно ту же псевдослучайную последовательность каждый раз.
Поставщик — в этом случае Microsoft — может гарантировать, что реализация PRSG никогда не изменится. Однако они этого не делают: зачем? Они указывают на PRNG, что-то похожее на генерацию энтропии.
Если вы используете PRNG для генерации повторяемых уникальных идентификаторов, вы лаете неправильное дерево.