在给定范围内生成随机整数和实数

问题描述 投票:3回答:1

根据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); ...

random chapel
1个回答
3
投票

[手册页中的注释表示与已经研究过的其他PCG随机数方法(至少由PCG算法的作者)有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.