20

次のプロパティで乱数を生成する必要があります。

最小値は 200 にする必要があります

最大値は 20000 にする必要があります

平均は500です。

オプション: 75 パーセンタイルを 5000 にする

間違いなく、一様分布でもガウス分布でもありません。左の歪みを与える必要があります。

4

5 に答える 5

12

Java Randomは、正規(ガウス)分布しか提供しないため、おそらく機能しません。

おそらく探しているのはf分布です(以下を参照)。ここでdistlibライブラリを使用して、 f分布を選択できます。乱数を使用して、乱数を取得できます。

ここに画像の説明を入力してください

于 2011-03-15T16:00:57.027 に答える
9

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を使用するか、ここを参照してください。

于 2011-06-09T16:46:48.847 に答える
4

これはあなたが探している答えではないかもしれませんが、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への称賛-私は彼の「包括的ランダム」関数を使用しています。

そして、はい、この方法は離散数で機能し、計算は連続的であったため、私の数が間違っていることに気付きました。誰かが私の国境事件を正すことができればいいのですが。

于 2011-06-10T08:55:14.213 に答える
3

次のように [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))そこにいます!

于 2011-03-16T08:48:17.463 に答える