gpt4 book ai didi

java - 高效的有界偏置随机数生成器

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:26 32 4
gpt4 key购买 nike

上下文

基于群体的增量学习 (PBIL) 算法的一部分是计算许多有偏差的随机位。每个位的偏差由0.0-1.0范围内相应的double决定。

对于每个位,将 0.0-1.0 范围内的无偏差随机 double 值与偏差进行比较。如果生成的随机 double 值小于偏差,则该位设置为 0,否则为 1。

生成有偏差的位序列后,这些位将转换为各种范围内的 double 值。

问题

我想直接在一个范围内生成一个有偏差的 double 。那是在不操纵 double 表示中的每一位的情况下。每个 double 然后将有一个变量来确定偏差(不是每个位一个)。如前所述,每个 double 也有一个最小和最大常量,用于确定随机 double 的下限和上限。

以下示例生成可接受的分布。然而,如果没有潜在的无限 while 循环就可以很好地解决问题。

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。

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

编辑:添加了受 Cristiano Zambon 的回答启发的潜在解决方案。

最佳答案

如果我理解得很好,您只需要一个函数返回一个随机编号的“以偏差为中心”并且始终在 {min;max} 范围内...

关于:

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

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

第二种解决方案:这有点棘手。这里的思路是总是生成一个对称的随机数,然后将生成的数映射到合适的范围内。例如:如果您有:

  • 最小 = 0
  • 最大值 = 1
  • 偏差 = 0.1

您首先生成一个以 0.5 为中心的随机数,其方差由您选择:

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

然后,如果 rnd > 0.5,则将其映射到范围 {bias; bias + max_bias} 具有简单的比例倍增。如果 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;
}

希望对您有所帮助。

关于java - 高效的有界偏置随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936619/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com