如果我理解得很好,你只需要一个函数,它返回一个随机编号的“居中”偏差,并且总是在 {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;
}
实际上,您只需使用以偏差为中心的高斯分布即可获得有偏差的随机数,其方差可以设置为范围的百分比(在示例中设置为双偏差深度 perc = 0.1 行的 10%)。
编辑:当偏差接近边界并且你得到很多超出限制的随机数时改变了行为。现在它只是简单地复制边界内的随机生成数,其距离等于与限制本身的距离。这实际上以简单的不对称分布结束。
第二个解决方案:这有点棘手。这里的想法是始终生成一个对称的随机数,然后将生成的数字映射到正确的范围内。例如:如果您有:
您首先生成一个以 0.5 为中心的随机数,并带有您选择的方差:
- rnd = 0.5 tRandom.nextGaussian() * 方差;
然后,如果 rnd > 0.5,则将其映射到范围 {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;
}
希望它可以帮助。