Скажем, мне нужно N криптографически безопасных псевдослучайных чисел в диапазоне [0, K). Наиболее очевидным способом достижения этого было бы N вызовов arc4random_uniform(3)
, и это именно то, что я делаю.
Однако профилировщик говорит мне, что многочисленные вызовы arc4random_uniform(3)
занимают 2/3 всего времени выполнения, и мне действительно нужно ускорить мой код. Вот почему я планирую заранее сгенерировать несколько случайных байтов (возможно, с arc4random_buf(3)
) и затем постепенно извлекать их из него.
Для K = 2 я могу просто замаскировать желаемый бит, но когда K не является степенью 2, все становится волосатым. Конечно, я могу использовать кучу %=
и /=
, но тогда у меня будет смещение по модулю. Другая проблема заключается в том, что когда N становится слишком большим, я больше не могу интерпретировать весь буфер как целое число и выполнять над ним арифметические операции.
Если это уместно, K будет меньше 20, тогда как N может быть действительно большим, например, миллионы.