【问题标题】:Random double and gaussian distribution随机双和高斯分布
【发布时间】:2017-02-23 20:40:27
【问题描述】:

我想生成双数 [-25,+25] 但它对我不起作用! 我使用了这段代码:

//=============== method set random individuals  (genes)======================
public void rand_gene() {
     double rand = new Random().nextDouble();
    for (int i=0 ;i<size;i++) {
        this.setGene(i, -25+(rand));
    System.out.print(genes[i]+"  ");
        } }

我想在昏迷后将其四舍五入为 2 个数字。

有什么帮助吗?

【问题讨论】:

  • 您想要高斯分布?您正在生成的是均匀分布。另外,高斯分布是没有界的,所以你想要一个截断的高斯分布吗?最后,“将其四舍五入为 2 个数字”是什么意思?您的意思是要从 {-25.00, -24.99, -24.98, ..., +24.98, +24.99, +25.00} 中选择值吗?
  • 我正在为进化策略算法生成正态分布,是的,我的意思是 [-25.00,....,+25.00 ]
  • 你想如何处理正态分布的无限尾?你想在 +/- 25 处截断吗?您希望分布的均值和标准差是多少? (我假设 0 均值,但如果你要截断,那么这里根本没有关于标准差的信息,也没有关于均值的保证。请提供你需要的全部细节。)
  • 我正在尝试编写进化策略 (1+1) ES,这意味着为 [1, n] 中的 i 生成一个带有 ri~ N(0, sigma^2) 的随机向量 r球体适应度函数 sum xi^2 ,我的范围是 +/-25。
  • 我已经用 nextdouble() 创建了随机向量,我想将每个向量与另一个包含 sigma 的随机向量关联起来,nextGaussian() 尊重范围

标签: java evolutionary-algorithm


【解决方案1】:

您的代码最根本的问题是您正在生成一个随机值并将其用于所有i。但是您的代码也存在其他问题。

高斯(也称为正态)分布有无限尾,因此如果您希望将随机变量限制为 [-25, +25],则它不能是高斯分布。典型的方法是使用truncated normal distribution。有几个库可以生成此类随机变量,您可以通过网络搜索找到它们。我先看看Stochastic Simulation in Java 库,或者可能是Broadwick(尤其是他们的TruncatedNormalDistribution class)。

穷人的近似是使用带有正态分布生成器的简单样本拒绝算法,如下所示。

另一个问题——您希望将值四舍五入到小数点后两位——很容易通过乘以 100,四舍五入到最接近的整数,然后除以 100 来完成。

这是我对做你想做的事的看法:

// initialize a random number generator
// for production work, consider using a better RNG than java.util.Random
private Random rng = new Random();
private double sigma = /* desired standard deviation */

public void rand_gene() {
    for (int i = 0; i < size; ++i) {
        setGene(i, nextRand());
    }
}

/** Return a random Gaussian in the range [-25, +25] */
private double nextRand() {
    double val;
    do {
        val = sigma * rng.nextGaussian();
        val = Math.round(val * 100) / 100.0;
    } while (val < -25 || val > 25);
    return val;
}

【讨论】:

  • 感谢回复,但我仍然对自己在做什么感到困惑,因为我知道我正在尝试编写进化策略 (1+1) ES,这意味着生成一个随机向量 r ri~ N(0, sigma^2) for i in [1, n] 使用球体适应度函数 sum xi^2 ,我的范围是 +/-25。代码是否符合我的算法?
  • @Nori - 听起来我在这里建议的代码应该用于生成随机向量 r。 (假设setGene(i, value)ri-th 分量设置为value。)结果的每个元素大约为N(n, sigma^2),截断为+ /-25.
  • 太棒了,我的问题似乎很愚蠢,但是 sigma 呢?为什么我们必须分配它,即使 nextGaussian 方法随机执行我猜!就我而言,val = sigma * rng.nextGaussian(); 对我的球体功能有何影响? )
  • @Nori - sigma 的值决定了分布的峰值有多窄或多宽。即使截断到 +/-25,分布也会有很大差异。对于非常大的 sigma,值可能几乎均匀分布在范围内。对于非常小的 sigma,值可能很少会超出 0 左右的更窄范围。有关 sigma 如何影响调用 rand_gene() 后应该看到的值的更多信息,请参阅 Wikipedia article on the 68-95-99.7 rule
  • @Nori - 我应该提到 68-95-99.7 规则在处理截断分布时实际上并不适用。我之所以向您推荐它,是因为它为思考截断范围和 sigma 将如何相互作用提供了一个很好的起点。
猜你喜欢
  • 2012-03-14
  • 2014-03-09
  • 2020-08-24
  • 2015-04-22
  • 2015-09-20
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多