我生成了简单的随机数,我想根据生成的值执行不同的操作。我有 9 种不同的动作。我不能switch
在值上使用结构,double
也不能从double
toint
使用switch
,所以我注定要使用if
结构吗?
if((rand > 0.0) && (rand < 1.0))
// case 1
else if...
// case 2
else if
// case 9
编辑:请注意,我的行为不是等概率的
我生成了简单的随机数,我想根据生成的值执行不同的操作。我有 9 种不同的动作。我不能switch
在值上使用结构,double
也不能从double
toint
使用switch
,所以我注定要使用if
结构吗?
if((rand > 0.0) && (rand < 1.0))
// case 1
else if...
// case 2
else if
// case 9
编辑:请注意,我的行为不是等概率的
创建一个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);
}
这张地图设置了五个区间:
现在在您的代码中,您可以这样做:
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;
}
给你,一些代码:
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;
}
如果动作是等概率的,您可以只使用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
.
好的,感谢您的回答和@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;
}
你不能用四舍五入吗?
int value=Math.round(yourDouble)