2

我正在使用默认的随机数生成引擎在 D 中生成一些种子随机数,并且根据我是请求整数还是浮点/双精度随机数生成,我得到了一些“略微偏离”的值。例如这段代码:

import std.random; // From docs: alias Random = MersenneTwisterEngine!(uint, 32, 624, 397, 31, 2567483615u, 11, 7, 2636928640u, 15, 4022730752u, 18).MersenneTwisterEngine;
int seed = 123;
Random genint = Random(seed);
Random gendouble = Random(seed);
foreach (i; 0..4) {
    writefln("rand[%d]: %d %f", i, uniform(0, 1000000, genint), uniform(0.0, 1000000.0, gendouble));
}

生成这些结果:

rand[0]: 696626 696469.187433
rand[1]: 713115 712955.321584
rand[2]: 286203 286139.338810
rand[3]: 428567 428470.925062

出于某种原因,它们很接近,但相差很大。这是预期的行为吗?我对用于生成数字的方法并不完全熟悉,所以我想知道是什么导致了这种情况的发生。具体来说,我对此感到好奇的原因是我正在尝试使用MTRandom 库将一些 D 代码移植到 Objective-C :

int seed = 123;
MTRandom *genint = [[MTRandom alloc] initWithSeed:seed];
MTRandom *gendouble = [[MTRandom alloc] initWithSeed:seed];
for (int i = 0; i < 4; i++) {
    NSLog(@"rand[%d]: %d %f", i, [genint randomUInt32From:0 to:1000000], [gendouble randomDoubleFrom:0.0 to:1000000.0]);
}

我得到了这些结果:

rand[0]: 696469 696469.187433
rand[1]: 712956 712955.321584
rand[2]: 286139 286139.338810
rand[3]: 428471 428470.925062

与检索随机双精度数相同,但这里的整数结果更接近.. 虽然有时相差一个!712955.32 是否应该使用这种随机生成方法四舍五入到 712956?我只是不知道...

我可以确保我的种子随机整数生成在 D 和 Objective-C 之间是相同的最好方法是什么?

4

1 回答 1

2

以下内容基于对文档页面的快速回顾:

我没有看到它在哪里表明结果uniform!int甚至uniform!double应该是远程接近的,也没有任何关于随机数生成器的位如何转换为请求类型的规范。

简而言之,我认为ints 和doubles 接近是一个实现细节,你不能依赖它。此外,我不依赖 obj-c 和 D 实现返回相同的doubles 序列,即使来自同一个种子。(但我希望您可以计算产生相同比特流的 MT 构造。)

如果您需要相同的序列,那么您将需要破解打开 obj-c 版本并将其移植到 D 中。

于 2014-03-05T18:06:02.623 回答