我的查詢非常簡單。我更喜歡用Java編寫數值方法,但通常需要在C++中做一些事情。我喜歡Java中的高斯隨機變量,因爲它使用Marsaglia算法並保留了兩個Normal隨機變量。它在第一次通話中返回一個,在第二次通話中返回第二個,並且在第三次通話之前不再進行昂貴的計算。使用下面的oracle鏈接(在程序註釋中)我嘗試在C++中實現這個代碼,但不知道如何編寫「Synchronized」公共方法的C++版本,這將允許我使用兩個Normal隨機變量。我不是一個專業的程序員,所以任何指導將不勝感激。Marsaglia在C++中的隨機變量
總之我想保留:
V2 *乘數
// This function is Similar to the GNU
// Java Implementation as seen on
// http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextGaussian%28%29
double nextGaussian() {
double v1, v2, s, nextNextGaussian;
do {
v1 = 2 * nextUniform() - 1; // between -1.0 and 1.0
v2 = 2 * nextUniform() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = sqrt(-2 * log(s)/s);
nextNextGaussian = v2 * multiplier;
return v1 * multiplier;
}
這不是完全清楚的代碼的問題,你有* *是什麼。 – 2012-02-03 04:39:56
那麼我只返回一個變量a的代碼會拋出另一個。當我需要下一個隨機變量時,我必須經歷再次生成兩個均勻隨機變量的繁重工作。這次像最後一次,我得到一個正常房車,並把另一個扔掉。在Java中,你返回一個Normal變量並保留下一次調用的第二個變量。所以你做了一半的工作。這對我的使用非常重要,因爲我的一些算法需要數天才能運行。 – JJJ 2012-02-03 04:41:26