【发布时间】:2020-05-01 21:26:45
【问题描述】:
我有一个嵌套系统,如下面的伪代码所述(随机加权多数算法的一部分):
function1() {
//for 100 iterations:
function2()
// grab logistics
}
function2() {
// create a random seed/generator
random_device rd;
mt19937 gen(rd);
//for 1000 iterations:
function3(gen);
}
function3(gen) {
// grab number from uniform_real_distribution using gen
// then use that number against differing weights
// such that higher weight gets more territory in the uniform distribution for its desired outcome
// that is in a system with weights (1, 1/2) distributed over a uniform distribution (0,1)
// outcome of weight 1 happens if dist lands (0,.6666) and outcome of weight 2 if dist lands (.6666, 1)
}
在上面的示例中,uniform_real_distribution 生成看似随机的数字,但 function1 总是以完全相同的结果结束。
然而,当我运行这个函数时,每次迭代都会得到相同的精确结果,即使其他两个函数应该是随机的。更糟糕的是,如果我将生成器从 mt19937 更改为 ranlux48,系统每次迭代都会得到完全相同的结果,但确切的结果将与 mt19937 得到的结果不同,这意味着我所做的一切都不是随机的-- 只依赖于生成器。
我需要有关如何解决此问题的指导,以便获得真正随机的结果。
gen 和 rd 应该放在哪里?我什至应该使用统一的实际分布吗?
如果我每次调用function3时都在函数3中创建gen,我仍然会得到非随机结果,实际上uniform_real_distribution每次都会生成完全相同的值
【问题讨论】:
-
尝试创建一个最小的可重现示例,而不仅仅是伪代码
-
function2不返回任何内容,因此其行为未定义(如果可以编译) -
尽早设置随机数生成器 (
random_device rd; mt19937 gen(rd);) 并重新使用它,除非您有充分的理由不这样做。很贵。