2

我生成了简单的随机数,我想根据生成的值执行不同的操作。我有 9 种不同的动作。我不能switch在值上使用结构,double也不能从doubletoint使用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);
}

这张地图设置了五个区间:

  • -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

如果动作是等概率的,您可以只使用Random.nextInt()上限和 a 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 回答
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 回答
-1

你不能用四舍五入吗?

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