Я пытаюсь реализовать метод Alias , также описанный здесь . Это алгоритм, который позволяет делать выборки из взвешенных N-сторонних кубиков в O (1).
Алгоритм требует генерации двух значений:
- Равномерно распределенное целое число
i
в [0, N]
- Равномерно распределенное действительное
y
в [0, 1)
В документе указывается, что эти два числа могут быть получены одним действительным числом x
между [0, N)
. Затем из x
можно получить два значения:
Теперь другие реализации, которые я видел, требуют генератора случайных чисел два раза, один для генерации i
и один для генерации y
. Учитывая, что я использую довольно дорогой генератор (std::mt19937
) и что мне нужно многократно выполнять выборку, мне стало интересно, существует ли лучший подход с точки зрения производительности при сохранении качества результата.
Я не уверен, имеет ли смысл использование uniform_real_distribution
для генерации x
, как если бы N
было большим, тогда распределение y
станет более разреженным, поскольку double
не распределены равномерно. Может быть, есть способ вызвать двигатель, получить случайные биты, а затем сгенерировать i
и y
из них напрямую?