Java, вопросы по поводу переключателей и корпусов? - PullRequest
0 голосов
/ 17 июля 2011

Итак, я хочу выполнить определенное действие в 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;  
        }

Ответы [ 5 ]

4 голосов
/ 17 июля 2011

Что-то вроде этого было бы гораздо более читабельным ИМО:

if( Math.random() >= probabilityOfDoingNothing ){

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

Re.Ваш вопрос о случаях, следующий код эквивалентен вашему коду:

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;  
}
3 голосов
/ 17 июля 2011
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.

См. это для более подробной информации о Randomclass.

Использование оператора switch полезно только в том случае, если вы хотите выполнить много действий, когда выполняемое действие зависит от чего-либо.Например, другое действие выполняется в зависимости от текущего месяца.Это быстрее, чем писать операторы if-else.

1 голос
/ 18 июля 2011

Если вы хотите, чтобы одно и то же действие происходило в нескольких случаях, не ставьте перерыв.Например,

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

В этом случае действие 1 произойдет как для случая 1, так и для 2.

0 голосов
/ 18 июля 2011

Существует много подходов к «случайному» поведению. Некоторые легче реализовать, чем другие, но они жертвуют энтропийным ведром. Random () - дорогая операция. Переключатель полезен для сложной сигнализации, но для двоичного решения, если вы хотите:

int signal = (int)(System.currentTimeMillis() % 5);
if(signal==0 || signal == 1){
 doActionTwo();//one third of the time
}else{
 doActionOne();//two thirds of the time
}
0 голосов
/ 17 июля 2011

Все, что вы можете сделать, это не применять разрыв между, как

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, если у вас есть диапазон значений ..

...