的基于人口增量学习(PBIL)算法的一部分是计算许多偏置随机比特。每个位的偏差由0.0-1.0范围内的对应双精度确定。
对于每一位,在0.0-1.0范围内的非偏置随机双与偏差进行比较。如果产生的随机双数小于偏差,则将该位设置为0否则为1.
在产生偏置的比特序列之后,比特在各个范围内转换为双打。
问题
我想直接产生的范围内的偏置的双。这是没有操纵双重表示中的每一位。然后,每一个double都会有一个确定偏差的变量(每个比特不是一个)。如前所述,每个double还有一个确定随机double的下限和上限的最小和最大常数。
以下示例会生成可接受的分布。然而,如果没有潜在的无尽循环,解决问题将会很好。
public double getBiasedRandom(double bias, double min, double max) {
double rndBiased;
double variance = (max-min)*0.3;
do {
rndBiased = bias + (random.nextGaussian() * variance);
} while(rndBiased < min && rndBiased <= max);
return rndBiased;
}
解决方案不必返回相同的分布,但边界内的所有值必须是任何偏差的可能结果。此外,接近偏差的值应该比远处的值更可能。我不知道多少。理想情况下,它将由可以通过实验设置的变量确定。在上面的例子中,这个变量是常数0.3。
我试着研究不同的分布,但我的数学技能不足。同时请记住,性能是至关重要的,一个近似的,但有效的解决方案可能是有利的。同样的原因,依赖加权表的解决方案可能不值得。
编辑:增加了一个潜在的解决方案,启发克里斯蒂亚诺赞姆的答案。
什么是“位转换为双倍或整数在不同范围内”的神奇缺失步骤?这对我来说很重要。没有,我不知道你真正想要什么 - 很容易给出一个技术上符合你的最终要求的例子,但绝对是错误的。 –
将位转换为整数或双精度并不重要。只要将初始位序列视为整数或双数组的位即可。 – Akinakes
问题不在于如何将有偏序的比特序列转换为整数和双精度,而是如何完全忽略比特级别并直接创建偏置整数和双精度。 – Akinakes