根据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
这里,我注意到手册页针对整数和实数情况都给出了以下注释:
对于整数,此类使用一种策略生成特定范围内的值,该值尚未经过严格研究,并且可能有统计问题]。
对于实数,此类通过计算[0,1]中的随机值并缩放和移动该值来生成[max,min]中的随机值。请注意不是可以以这种方式构造区间[min,max]中的所有可能的浮点值
。((我使用斜体字强调)。对于实数,这与所谓的“浮点数密度”有关,例如在this page中问)?此外,对于整数,是否存在某些情况,即使是“典型”使用,也需要小心吗?(此处,“典型”是指,例如,在给定范围内大致平坦分布的10 ** 8个随机整数的生成。)
FYI,我的“用例”不是像对随机数进行严格的质量测试那样,而是典型的蒙特卡洛计算(例如,选择立方晶格上的随机位置)。
根据PCGRandom模块中getNext的手册页,我们可以生成给定范围内的随机数,例如:use Random; var rng1 =新拥有的RandomStream(eltType = real,seed = 100); ...
[手册页中的注释表示与已经研究过的其他PCG随机数方法(至少由PCG算法的作者)有所不同。