次のプロパティで乱数を生成する必要があります。
最小値は 200 にする必要があります
最大値は 20000 にする必要があります
平均は500です。
オプション: 75 パーセンタイルを 5000 にする
間違いなく、一様分布でもガウス分布でもありません。左の歪みを与える必要があります。
SayX
はターゲット変数であり、を実行して範囲を正規化しますY=(X-200)/(20000-200)
。したがって、ここで、meanを使用しY
て値を受け取る確率変数が必要です。[0,1]
(500-200)/(20000-200)=1/66
あなたには多くの選択肢がありますが、最も自然なものは私にはベータ分布の ようです-あなたY ~ Beta(a,b)
にa/(a+b) = 1/66
は余分な自由度があり、最後の四分位数の要件に合うようにどちらかを選択できます。
その後、Xを次のように返すだけです。Y*(20000-200)+200
ベータ確率変数を生成するには、Apache Commonsを使用するか、ここを参照してください。
これはあなたが探している答えではないかもしれませんが、3つの一様分布の特定のケースです:
(左側の数字は無視してください。ただし、縮尺どおりです!)
public int generate() {
if(random(0, 65) == 0) {
// 50-100 percentile
if(random(1, 13) > 3) {
// 50-75 percentile
return random(500, 5000);
} else {
// 75-100 percentile
return random(5000, 20000);
}
} else {
// 0-50 percentile
return random(200, 500);
}
}
どうやって数字を手に入れたのか
まず、曲線の下の面積は200〜500と500〜20000の間で等しくなります。これは、高さの関係が作られていることを意味300 * leftHeight == 19500 * rightHeight
しますleftHeight == 65 * rightHeight
これにより、1/66の確率で右を選択し、65/66の確率で左を選択できます。
次に、比率がであったことを除いて、75パーセンタイルに対して同じ計算を行いました500-5000 chance == 5000-20000 chance * 10 / 3
。繰り返しますが、これは、50〜75パーセンタイルになる可能性が10/13であり、75〜100になる可能性が3/13であることを意味します。
@Stasへの称賛-私は彼の「包括的ランダム」関数を使用しています。
そして、はい、この方法は離散数で機能し、計算は連続的であったため、私の数が間違っていることに気付きました。誰かが私の国境事件を正すことができればいいのですが。
次のように [0;1] で機能する関数 f を持つことができます
Integral(f(x)dx) on [0;1] = 500
f(0) = 200
f(0.75) = 5000
f(1) = 20000
私はフォームの関数を推測します
f(x) = a*exp(x) + b*x + c
関連するシステムを解決する必要があるだけです。
それから、あなたはf(uniform_random(0,1))
そこにいます!