0

Javaの範囲のリストがあります

public class Range {
   private int min, max;
   //constructor, getters, setters go here
}

したがって、リストは次のようになります

ranges = [[3,9], [18,45], [90,112]]

そして、次の関数を作成する必要があります

public int getRandomValueWithinRanges() {
   //returns a value which is contained inside a range inside the ranges ArrayList
}

これどうやってするの?これらの範囲内の各値は、選択される確率が等しい必要があり、効率的に実行する必要があります (つまり、範囲内のすべての値のリストを作成し、そのリストからランダムに選択するのは効率的ではありません)。

4

3 に答える 3

7

さて、1つのアプローチ:

  1. すべての範囲を合計します (つまり、それらがまたがる整数の総数)

  2. からランダムな値を選ぶ[0-total)

  3. ランダムな値をインデックスとして扱い、このインデックスが対応する範囲を段階的に見つけます

  4. 上記のインデックスを含む範囲の開始に基づいて乱数をオフセットします..

于 2012-12-30T06:53:31.677 に答える
1

最善の解決策は、同じ範囲のリストを使用して を何度も呼び出してセットアップ コストを償却できるかどうかによって異なります。getRandomValueWithinRanges

償却できない場合は、@pst のアプローチが最適です。

償却できる場合は、メソッドを高速化するさまざまな方法があります。例えば

  • すべての範囲の要素の配列リストを作成します。これにより、最速getRandom...の が得られますが、セットアップ時間が長くなり、スペースのオーバーヘッドが大きくなります。
  • データ構造を構築して、(@pst のソリューションで) ランダム インデックスから値へのマッピングを高速化します。

ランダムな範囲とその範囲内のランダムな要素を単純に選択すると、乱数の選択に偏りが生じやすいことに注意してください...範囲の選択などに重みを付けて補償する方法を見つけられない限り。

于 2012-12-30T08:05:01.650 に答える
1

まず、ランダムな範囲を選択します。次に、選択したランダム範囲からランダムな整数を選択します。

于 2012-12-30T07:24:00.820 に答える