Java,关于交换机和案例的问题?

因此,我希望在60%的时间内执行某项操作,并在40%的时间内执行另一项操作。 而且有时它也没有。 我能想到的最好的方法是通过开关和制作一堆案例。 下面是一个例子,如果这对你没有任何意义。 我的问题是,有更好的方法吗? 有没有办法让案例0-5在一个语句中执行操作1?

Random rand = new Random(50); switch(rand.nextInt()) { case 1: { do action 1 } break; case 2: { do action 1 } break; case 3: { do action 1 } break; case 4: { do action 1 } break; case 5: { do action 1 } break; case 6: { do action 1 } break; case 7: { do action 2 } break; case 8: { do action 2 } break; case 9: { do action 2 } break; case 10: { do action 2 } break; } 

像这样的东西会更容易阅读IMO:

 if( Math.random() >= probabilityOfDoingNothing ){ if( Math.random() < 0.6 ){ action1; }else{ action2; } } 

回覆。 关于案例的问题,以下内容相当于您的代码:

 Random rand = new Random(50); switch(rand.nextInt()) { case 1: case 2: case 3: case 4: case 5: case 6: { do action 1 } break; case 7: case 8: case 9: case 10: { do action 2 } break; } 
 Random rand = new Random(50); int n = rand.nextInt(11); if(n<=6) do action 1 else do action 2 

您需要使用nextInt(n)来生成0(包括)和n(不包括)之间的数字。 在这种情况下,我们使用11给出了0到10之间的数字。任何低于6(60%几率)的事情我们都会采取行动1否则就行动2。

有关Random类的更多详细信息,请参阅此处。

使用switch语句仅在您要执行许多操作时才有用,其中执行的操作取决于某些操作。 例如,基于当前月份执行不同的动作。 它比编写if-else语句更快。

如果您希望针对多个案例执行相同的操作,请不要放弃。 例如

 case 1: case 2: do action 1; break; 

在这种情况下,情况1和2都会发生动作1。

你所能做的就是不要在两者之间适用

 case 1: case 2: case 3: case 4: case 5: do action 1; break case 6: case 7: do action 2; break default : break; 

或者使用if-else,如果你有价值范围..

“随机”行为有很多种方法。 有些比其他更容易实现,但这些牺牲了熵桶。 Random()是一项昂贵的操作。 Switch对于复杂的信令很有用,但对于二元决策来说,如果你想要的话:

 int signal = (int)(System.currentTimeMillis() % 5); if(signal==0 || signal == 1){ doActionTwo();//one third of the time }else{ doActionOne();//two thirds of the time }