Насколько я понимаю, установка srand с определенным семенем приводит к тому, что последовательность вызовов rand () каждый раз генерирует одну и ту же серию чисел для этого конкретного семени:
Eg:
srand(seed1);
rand() // firstnumber (e.g.: 42)
rand() // second number (e.g: 17)
srand(seed1)
rand() // first number (same as above (42))
rand() // second number (same as above (17))
Есть ли способ получить n-е число в последовательности напрямую, не вызывая rand () n раз?
Например, если мне нужно 17-е случайное число в серии, я хочу получить это число за один вызов, вместо того, чтобы вызывать rand () 17 раз.
Я не могу предварительно вычислить и сохранить значения
РЕДАКТИРОВАТЬ: я смотрел эту статью:
Ответ на регистры сдвига с линейной обратной связью, кажется, делает это, но вместо того, чтобы реализовывать его сам, я бы предпочел использовать надежную реализацию, поскольку это кажется распространенной проблемой.
РЕДАКТИРОВАТЬ: Причина, по которой я хочу «перейти» к n-му термину, заключается в том, что я использую rand в разных классах с разными начальными числами и продолжаю прыгать вперед и назад между каждым классом. Я хочу, чтобы последовательность в каждом классе продолжалась с того места, где она была остановлена, вместо того, чтобы каждый раз начинать с первого числа. Это однопоточное приложение.
РЕДАКТИРОВАТЬ: при написании сообщения я использовал термин ГПСЧ. Но на самом деле я просто ищу функцию, которая производит случайное число. Я использую это для графики, поэтому проблем с безопасностью нет. Я использую случайные числа для получения небольшого смещения в пикселях.
- Мне просто нужна быстрая функция.
- Кажется, что выдает случайные числа, но не обязательно из тех, что используются в приложениях безопасности.
- Уметь вычислить n-е число за O (1) раз.
Изменить: совершил ошибку - состояния хранения недостаточно. Мне нужно вычислить n-е случайное число последовательно за время O (1). Поскольку в одном классе может быть несколько вызовов для одного и того же n-го члена, сохранения состояния будет недостаточно, и мне нужно вычислить n-й член в O (1)