2017-02-23 44 views
-3

我想生成雙數[-25,+ 25],但它不適用於我! 我用這個代碼:隨機double和高斯分佈

//=============== 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號。

有幫助嗎?

+0

你想要一個高斯分佈?你生成的是一個統一的分佈。另外,高斯不是有界的,所以你想要一個截斷的高斯分佈?最後,你的意思是「將它舍入2個數字」?你的意思是你想要從{-25.00,-24.99,-24.98,...,+ 24.98,+ 24.99,+25.00}中選擇值嗎? –

+0

我爲進化策略算法生成一個正態分佈,是的,我的意思是[-25.00,....,+ 25.00] – Nori

+0

你想如何處理正態分佈的無限尾?你想只在+/- 25截斷嗎?你想要分配什麼樣的平均值和標準差? (我假設0意味着,但如果你截斷,那麼在這裏沒有關於標準偏差的信息,也沒有關於平均值的保證,請提供你需要的全部細節。) –

回答

0

您的代碼最基本的問題是您正在生成一個隨機值並將其用於所有i。但是你的代碼也有其他問題。高斯(又稱。法線)分佈具有無限的尾部,所以如果你想隨機變量被限制爲[-25,+ 25],它不能是高斯分佈。典型的方法是使用truncated normal distribution。有幾個庫可以生成這種隨機變量,您可以通過網絡搜索找到這些變量。我首先看看Stochastic Simulation in Java庫,或者Broadwick(特別是它們的TruncatedNormalDistribution class)。

窮人的近似值是使用簡單的採樣 - 拒絕算法和正態分佈生成器,如下所示。

要值四捨五入至小數點後2位—容易被乘以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; 
} 
+0

thx用於回覆,但我仍然對我正在做的事情感到困惑,那\t 我試圖編碼的進化策略(1 + 1)ES,意味着生成一個隨機向量r與ri〜N(0,sigma^2)爲我在[1,n]使用球適應度函數和xi^2,我的範圍是+/- 25。是關於我的算法adabt的代碼? – Nori

+0

@Nori - 好吧,這聽起來像我在這裏建議的代碼應該用於生成隨機向量_r_。 (假設'setGene(i,value)'將_r_的第i個分量設置爲'value')。結果的每個元素將近似爲N(n,sigma^2),截斷爲+/- 25。 –

+0

太棒了,我的問題似乎很傻,但西格瑪呢?爲什麼我們必須分配它,即使下一個高斯方法隨機做它我geuss!在我的情況下,這個'val = sigma * rng.nextGaussian();'對我的球體函數有什麼影響? ) – Nori