2

重複の可能性:
不均一な密度で乱数を生成する

不均一な分散数列を与える関数 (Java で) を特定/作成しようとしています。からまでfunction f(x), and x>0の乱数を与えるという関数がある場合。0x

この関数は、与えられたもので最も機能しxます。以下は、私がどのようにしたいかの例にすぎません。

x=100しかし、関数f(x)が s nonunifrom distributed を返すと言った場合。

たとえば、

0 to 20全体の約20%になります。

21 to 50すべてのケースの約 50% になります。

51 to 70全体の約20%になります。

71 to 100すべてのケースの約 10 になります。

要するに、正規分布のような数値が得られ、この場合xは30 ~ 40 でピークになり100ます。

http://en.wikipedia.org/wiki/Normal_distribution

(必要に応じてスコアとして一様乱数生成を使用できます。また、一様な結果から一様でない結果に変換する関数のみを使用できます。)

編集

この問題に対する私の最終的な解決策は次のとおりです。

/**
 * Return a value from [0,1] and mean as 0.3, It give 10% of it is lower
 * then 0.1. 5% is higher then 0.8 and 30% is in rang 0.25 to 0.45
 *
 * @return
 */
public double nextMyGaussian() {
    double d = -1000;
    while (d < -1.5) {
        // RANDOMis Java's normal Random() class.
        // The nextGaussian is normal give a value from -5 to +5?
        d = RANDOM.nextGaussian() * 1.5;
    }
    if (d > 3.5d) {
        return 1;
    }
    return ((d + 1.5) / 5);
}
4

5 に答える 5

4

簡単な解決策は、0 から 9 の間の最初の乱数を生成することです。

0 は最初の 10 パーセント、1 は次の 10 パーセントなどを意味します。

したがって、0 または 1 を取得すると、0 から 20 の間の 2 番目の乱数が生成されます。2、3、4、5、または 6 を取得した場合、21 から 50 の間の 2 番目の乱数が生成されます。

于 2012-11-07T22:49:00.470 に答える
2

1 ~ X の範囲の乱数を合計して平均を取る関数を書いていただけませんか? これは、nが増加するにつれて正規分布になる傾向があります

見る:

C/C++ で正規分布に従って乱数を生成する

私は以下のようなものをハッキングしました:

class CrudeDistribution {

    final int TRIALS = 20;

    public int getAverageFromDistribution(int upperLimit) {
        return getAverageOfRandomTrials(TRIALS, upperLimit);
    }

    private int getAverageOfRandomTrials(int trials, int upperLimit) {
        double d = 0.0;
        for (int i=0; i<trials; i++) {
            d +=getRandom(upperLimit);
        }
        return (int) (d /= trials);
    }

    private int getRandom(int upperLimit) {
        return (int) (Math.random()*upperLimit)+1;
    }
}

Commons-Math には、平均と標準偏差 (広がりを測定する) に基づいて分布を生成できるライブラリがあります。リンクには、これを行ういくつかのアルゴリズムがあります。

おそらく、関連する 2 ライナーを見つけるためのハンティングの楽しい時間です。

https://commons.apache.org/math/userguide/distribution.html

于 2012-11-07T23:04:25.827 に答える
0

最初にf(x)を作成する必要があります。

値xが等確率であると仮定すると、f(x)は次のようになります。

double f(x){
if(x<=20){
 return x;
}else if (x>20 && x<=70){
 return (x-20)/50*30+20;
} else if(...

于 2012-11-07T23:09:33.507 に答える
0

束を生成するだけで、たとえば少なくとも30個、0からxまでの均一な乱数を生成します。次に、それらの平均を取ります。平均は、中心極限定理に従い、x/2を中心とする正規分布からの乱数になります。

于 2012-11-07T23:10:50.913 に答える
0

1 つの解決策は、1 ~ 100 の間の乱数を実行し、その結果に基づいて適切な範囲で別の乱数を実行することです。

1-20 -> 0-20

21-70 -> 21-50

71-90 -> 51-70

91-100 -> 71-100

それが理にかなっていることを願っています。

于 2012-11-07T22:50:47.090 に答える