2

単純な乱数を生成し、生成された値に応じてさまざまなアクションを実行したいと思います。9つの異なるアクションがあります。switch値に構造体を使用doubleできず、からキャストしdoubleint使用することもできないswitchので、構造体を使用する運命にありますifか?

if((rand > 0.0) && (rand < 1.0))
   // case 1
else if...
   // case 2
else if
   // case 9

編集:私の行動は等確率ではないことに注意してください

4

5 に答える 5

2

static TreeMap<Double,Integer>整数の「ケース ラベル」への間隔制限マッピングを使用して を作成します。メソッドを使用しhigerEntryて、ランダムに生成された に最も近い値のエントリを取得しdouble、結果の値をswitchステートメントで使用します。

static final TreeMap<Double,Integer> limits = new TreeMap<Double,Integer>();
static {
    limits.put(1.0, 0);
    limits.put(3.5, 1);
    limits.put(8.0, 2);
    limits.put(10.3, 3);
}

このマップは 5 つの間隔を設定します。

  • -inf..1.0
  • 1.0..3.5
  • 3.5..8.0
  • 8.0..10.3
  • 10.3..+inf

コードでこれを行うことができます:

double someNumber = ... // Obtain a random double
Map<Double,Integer> entry = higerEntry(someNumber);
switch (entry.getValue()) {
    case 0: ... break;
    case 1: ... break;
    case 2: ... break;
    case 3: ... break;
    default: ... break;
}
于 2012-12-20T13:45:06.273 に答える
1

ほら、いくつかのコード:

    switch ((int) (rand * 10)) {
    case 0:
    case 1:
    case 2:
    case 3:
        System.out.println("Between 0 and 3");
        break;
    case 4:
        System.out.println("4");
        break;
    case 5:
        System.out.println("5");
        break;
    case 6:
        System.out.println("6");
        break;
    default:
        System.out.println("More then 6");
        break;
    }
于 2012-12-20T13:49:33.623 に答える
0

あなたの答えと@dasblinkenlightのおかげで、私は私の問題に対するカスタムソリューションを見つけました:

static final Map<Integer, Double> cases = new HashMap<Integer, Double>(9);

static{             
    cases.put(1, 30.0);
    cases.put(2, 55.0);     
    cases.put(3, 70.0);     
    cases.put(4, 80.0);     
    cases.put(5, 84.0);     
    cases.put(6, 88.0);     
    cases.put(7, 92.0);     
    cases.put(8, 96.0);     
    cases.put(9, 100.0);
}

switch (getIntFromDouble(Math.random()*100)) {
    case 0 : ...
        break;

    case 1 : ...
        break;

    ...     

    case 9 : ...
        break;

}

private int getIntFromDouble(double rand){

    for(Map.Entry<Integer, Double> entry : cases.entrySet()){
        if(rand <= entry.getValue())
            return entry.getKey();
    }

    return Integer.MAX_VALUE;
}
于 2012-12-20T14:51:28.980 に答える
0

アクションが等確率である場合Random.nextInt()、上限とswitch:

      Random rand = new Random();
      ...
      switch (rand.nextInt(10)) {
      case 0: ...; break;
      case 1: ...; break;
      case 9: ...; break;
      }

[0, 1)浮動小数点乱数で同じ手法を使用できます。を掛けて に10キャストするだけintです。

于 2012-12-20T13:45:05.463 に答える
-1

丸めは使えないの?

int value=Math.round(yourDouble)
于 2012-12-20T13:46:48.630 に答える