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

Random 生成给定范围内的随机整数和实数,random,chapel,Random,Chapel,根据模块中的手册页,我们可以在给定范围内生成随机数,例如: 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();

根据模块中的手册页,我们可以在给定范围内生成随机数,例如:

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):

在这里,我注意到手册页给出了整数和实数情况的以下注释:

对于整数,此类使用一种策略来生成特定范围内的值,该值未经过严格研究,可能存在统计问题

对于实数,此类通过计算[0,1]中的随机值并缩放和移动该值来生成[max,min]中的随机值。注意,并非间隔[min,max]中所有可能的浮点值都可以用这种方式构造

(我用斜体字强调)。对于实数,这是否与所谓的“浮点数密度”有关(例如,在中询问)?此外,对于整数,是否有一些情况下,我们需要小心,即使是“典型”的使用? (这里,“典型”是指,例如,在给定范围内近似平坦分布的10**8个随机整数的生成。)


仅供参考,我的“使用案例”不是对随机数的严格质量测试,而是典型的蒙特卡罗计算(例如,在立方晶格上选择随机点)。

手册页中的注释表明与已研究的其他PCG随机数方法不同(至少是PCG算法的作者)

浮点数的问题确实与浮点数密度有关。请参阅PCG作者的文章。即使在[0.0,1.0]中生成随机数,这也是一个潜在问题。文档中的这一段描述了该问题:

当生成实数、虚数或复数时,此 实现使用生成64位无符号 整数,然后将其乘以2.0**-64,以便将其转换为 一个浮点数。而这并不构成一个统一的 基于四舍五入浮点值的分布,它省略了许多 可能的实际值(例如,2**-128)。我们认为 策略具有合理的统计特性 这个策略是,实数1.0可以生成,因为 舍入。可以生成实数0.0,因为PCG可以生成 值0为随机整数

请注意,64位实数可以存储小到
2.0**-1024
的数字,但通过将正整数除以
2**64
来获得这样的数字是不可能的(在这里和上面我使用
**
作为求幂运算符,因为它在语法中就是这样做的)。我建议您阅读IEEE浮点格式(例如or)以了解这方面的背景信息。如果您使用RNG为在
real(64)上运行的算法生成测试输入,您可能会关心这一点
值。在这种情况下,您可能希望生成非常小的值。请注意,以非统一方式构建能够生成所有
real(64)
值的RNG并不难(例如,只需将位从
uint
复制到
real

关于你问题的另一部分:

我用TestU01对特定范围内的随机整数的生成进行了一些基本的统计测试,我对它在蒙特卡罗计算中的应用很有信心。但是我不是这方面的专家,因此我在文档中给出了警告。文档中的以下信息描述了我所做的测试身份证:

我们已经使用TestU01(可在 )1.我们量了我们的体重 使用TestU01 1.2.3和Crush套件实现,包括 144项统计测试的结果如下:

  • 生成统一实数没有失败
  • 1生成32位值失败(对于具有相同配置的PCG参考版本也是如此)
  • 0生成64位值失败(我们将其作为2提供给TestU01 不同的32位值,因为它一次只接受32位)
  • 0生成有界整数失败(我们通过请求
    [0..2**31+2**30+1]中的值提供给TestU01)
    ,直到我们有两个值<2**31,删除前0位,然后将前16位组合成提供给TestU01的值)

(非常感谢您的详细回答,很高兴听到普通MC应用程序可以。我将阅读链接页面,并在必要时询问更多问题。)
4.50371
4.85573
4.2246
4.84289
3.63607

36
57
79
39
57