0

ユーザー入力 % に基づいて乱数を生成するのを手伝ってください。
たとえば、入力が 60、10、および 30 の場合、出力は次のようになります。

0 ~ 70 の範囲の乱数の 60% 70 ~ 80 の範囲
の乱数の 10%
80 の範囲を超える乱数の 30%

マルチレンジジェネレーターを使用する必要がありますか?
またはすべての可能性は何ですか?

コードは次のとおりです。

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

class RandomInRanges
{
    private final List<Integer> range = new ArrayList();

    RandomInRanges(int min, int max)
    {
        this.addRange(min, max);
    }

    final void addRange(int min, int max)
    {
        for(int i = min; i <= max; i++)
        {
            this.range.add(i);
        }
    }

    int getRandom()
    {
        return this.range.get(new Random().nextInt(this.range.size()));
    }

    public static void main(String[] args)
    {
        RandomInRanges rir = new RandomInRanges(1, 200);
        rir.addRange(50, 60);
        System.out.println(rir.getRandom());
    }
}
4

1 に答える 1

4

一般的なアプローチは次のようになります。

  • 頻度に基づいて、単位間隔 (0, 1) を領域に分割します。
  • 各パーティション要素から対応する目的の範囲への線形マッピングを定義します。
  • (0, 1) 上に一様に分布する乱数を生成します。
  • 各乱数が (0, 1) のどの部分に該当するかに基づいて、適切なマッピングを適用します。

投稿された例を使用すると、範囲は (0, .6)、(.6, .7)、(.7, 1) になります。最初のマッピングは (0, .6) から (0, 70) になります: y = 70 * x / 0.6. 2 番目のマッピングは (0.6, 0.7) から (70, 80) になります: y = 70 + 100 * (x - 0.6)。3 番目のマッピングでは、生成する最大数を知る必要があります。

上記は、いくつかの範囲にわたる連続した一様分布に対して機能します。範囲はすべて開いていることに注意してください (境界点に正確に到達する確率はゼロであり、同点は任意に解決できるため、連続分布の場合は問題になりません。整数値に対してこれを行う場合は、次を使用できます。同じアプローチを使用して、結果のフロアを取得します.バイアスの導入を避けるために、エンドポイントが適切に処理されるように、少し注意する必要があります.

最後に (明らかであることを願っています): これは、目的の出力範囲がばらばらである場合にのみ機能します。(例のように)連続した範囲を持つ離散分布の場合、これには、各境界点がどの範囲に入るかを決定する必要があります。

于 2013-09-24T21:41:24.550 に答える