2013-07-30 58 views
1

语境高效界偏随机数发生器

的基于人口增量学习(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。

我试着研究不同的分布,但我的数学技能不足。同时请记住,性能是至关重要的,一个近似的,但有效的解决方案可能是有利的。同样的原因,依赖加权表的解决方案可能不值得。

编辑:增加了一个潜在的解决方案,启发克里斯蒂亚诺赞姆的答案。

+0

什么是“位转换为双倍或整数在不同范围内”的神奇缺失步骤?这对我来说很重要。没有,我不知道你真正想要什么 - 很容易给出一个技术上符合你的最终要求的例子,但绝对是错误的。 –

+0

将位转换为整数或双精度并不重要。只要将初始位序列视为整数或双数组的位即可。 – Akinakes

+0

问题不在于如何将有偏序的比特序列转换为整数和双精度,而是如何完全忽略比特级别并直接创建偏置整数和双精度。 – Akinakes

回答

1

如果我深知,你只需要返回一个随机编号为“中心”的偏见始终把里面的函数{分钟;最大}范围...

怎么样:

public double getBiasedRandom(double bias, double min, double max) { 
    double bias_depth_perc = 0.1; 
    double bias_depth_abs = (max - min)*bias_depth_perc; 
    double min_bias = bias - bias_depth; 
    double max_bias = bias + bias_depth; 
    Random tRandom = new Random(); 

    if (max_bias > max) max_bias = max; 
    if (min_bias < min) min_bias = min; 

    double variance = (max_bias - min_bias)/2; 


    double rndBiased = bias + tRandom .nextGaussian() * aVariance; 

    if (rndBiased > max) 
     rndBiased = max - (rndBiased - max); 

    if (rndBiased < min) 
     rndBiased = min + (min - rndBiased); 

    return rndBiased; 
} 

实际上,只需使用以偏差为中心的高斯分布以及可以设置为范围百分比(在示例中设置为10%,行double bias_depth_perc = 0.1)的偏差即可得到有偏随机数。

编辑:改变偏差接近边界时的行为,你会得到很多超出限制的随机数。现在只需将边界内随机生成的数字复制一段等于距离限制本身的距离。这实际上以简单的不对称分布结束。

SECOND SOLUTION: 这有点棘手。这里的想法是始终生成一个对称的随机数,然后将生成的数字映射到正确的范围。例如:如果你有:

  • 分钟= 0
  • 最大= 1
  • 偏压= 0.1

你首先产生集中在0.5与您选择的方差的随机数:

  • rnd = 0.5 tRandom.nextGaussian()*方差;

然后,如果rnd> 0.5,则将其映射到范围{bias;偏差+ max_bias}与一个简单的规模moltiplication。 如果rnd是< 0.5,则将其映射到范围{min_bias;偏压}。

这里是代码:

public double getBiasedRandom(double bias, double min, double max) { 
    double centered_depth_perc = 0.3; 
    double centered_depth_abs = (max - min)*centered_depth_perc; 
    double center = 0.5; 

    Random tRandom = new Random(); 
    double rndCentered = center + tRandom .nextGaussian() * centered_depth_abs; // generate centered random number. 

    if (rndCentered >= center) 
     rndBiased = (rndCentered - center) * (max - bias) + bias; 
    else 
     rndBiased = bias - (center - rndCentered) * (bias - min); 

    // the following two tests will be as more important as centered_depth_perc 
    // get bigger. 
    if (rndBiased > max) 
     rndBiased = max; 

    if (rndBiased < min) 
     rndBiased = min; 

    return rndBiased; 
} 

希望它可以帮助。

+0

谢谢!你从哪个库导入RandomGaussian()?或者你只是缩放和抵消从Random.nextGaussian()的结果? – Akinakes

+0

我用rndBiased = bias +(random.nextGaussian()*方差)并比较了几个分布。首先,bias_depth_perc必须更高才能使另一个极端的值不仅仅是理论上的可能性。这是预期的,但它揭示了一个问题。如果bias_depth_perc高,那么许多值超出范围,并且最大值或最小值是最可能的值,而不是偏差。我认为不对称和有界的分布是必要的? – Akinakes

+0

是的,你确定你是对的......我正在编辑我的答案,适合RandomGaussian问题。只要给我halfen小时:) –