Какой лучший способ генерировать псевдослучайные числа в замкнутом интервале [0,1] вместо обычного [0,1)?Одна идея, которую я придумал, это отклонить значения в (1 / 2,1), а затем удвоить число.Интересно, есть ли лучший метод?
real x
do
call random_number(x)
if (x <= 0.5) exit
end do
x = 2*x
print *, x
end
Наиболее важным требованием является то, что алгоритм не должен иметь худшее распределение (с точки зрения однородности и корреляции), чем сгенерированное random_number()
.Также я бы предпочел простоту.Обертка вокруг random_number()
была бы очень хороша, я не собираюсь реализовывать совершенно новый генератор.
Как указывает @francescalus в комментариях, с алгоритмом выше множества чисел в [0,1] будет иметь нулевую вероятность появления.Следующий код реализует немного другой подход: интервал немного увеличивается, затем значения, превышающие 1, вырезаются.Он должен вести себя лучше в этом аспекте.
real x
do
call random_number(x)
x = x*(1 + 1e-6)
if (x <= 1.) exit
end do
print *, x
end