Согласно справочной странице getNext в модуле PCGRandom , мы можем генерировать случайные числа в заданном диапазоне, например:
use Random;
var rng1 = new owned RandomStream( eltType= real, seed= 100 );
var rng2 = new owned RandomStream( eltType= int, seed= 100 );
for i in 1..5 do
writeln( rng1.getNext( min= 3.0, max= 5.0 ) );
writeln();
for i in 1..5 do
writeln( rng2.getNext( min= 20, max= 80 ) );
, что дает (с chpl-1.20.0):
4.50371
4.85573
4.2246
4.84289
3.63607
36
57
79
39
57
Здесь я заметил, что страница man дает следующие примечания как для целых, так и для действительных чисел:
Для целые числа, этот класс использует стратегию для генерации значения в определенном диапазоне, который не подвергался тщательному изучению, и может иметь статистические проблемы .
Для действительных чисел этот класс генерирует случайное число значение в [max, min] путем вычисления случайного значения в [0,1], масштабирования и сдвига этого значения. Обратите внимание, что не все возможные значения с плавающей запятой в интервале [min, max] могут быть построены таким образом .
(где я выделил курсивом). Для действительных чисел это связано с так называемой «плотностью числа с плавающей точкой», например, задаваемой в на этой странице )? Кроме того, для целых чисел, есть ли какой-то случай, который нам нужно соблюдать осторожность даже для «типичного» использования? (здесь «типичный» означает, например, генерацию 10 ** 8 случайных целых чисел, распределенных приблизительно плоско в заданном диапазоне.)
К вашему сведению, мой «сценарий использования» не похож на строгие качественные тесты для случайных числа, но только типичные вычисления Монте-Карло (например, выбор случайных сайтов на решетке кубических c).