Выбрать число случайным образом из двух чисел

у меня два целых числа, пусть они будут

int a = 35:
int b = 70;

Я хочу выбрать один из них случайным образом во время выполнения и назначить другой переменной. Т. е.

int c = a or b:

или randomize boolean и использовать его в if-else.

мой вопрос заключается в том, что есть лучше и больше эффективный способ достичь этого? Т. е. выбрать число из двух ранее определенных чисел?

5 ответов


есть ли конкретная причина, по которой вы просите более эффективное решение? Если эта функциональность не находится в очень плотном внутреннем цикле где-то (например, в трассировщике лучей), вы можете попытаться преждевременная оптимизация ваш код.

если вы хотите избежать массива, и если вам не нравится "раздувание" оператора if, вы можете использовать оператор тройного выбора, Чтобы выбрать между ними:

int a = 35;
int b = 70;
int c = random.nextBoolean() ? a : b;

здесь random пример java.util.Random. Вы можете сохранить этот экземпляр как final static поле в вашем классе для его повторного использования.

если вы не требуете истинной случайности, но просто хотите переключаться между двумя числами в каждом вызове данного блока кода, Вы можете просто сохранить boolean а это:

...
int c = toggle ? a : b;
toggle = !toggle;

поскольку я не могу комментировать другие ответы, я хотел бы указать на проблему с некоторыми другими ответами, которые предлагают генерировать случайное целое число в большем диапазоне и делать решение основано на том, является ли результат нечетным или четным, или если он ниже или больше среднего значения. По сути, это то же самое, что генерировать случайное целое число от 0 до 1, за исключением чрезмерно сложного. The nextInt(n) метод использует оператор по модулю на случайно сгенерированное целое число между -2^31 и (2^31) -1, что по существу то, что вы будете делать в конце концов в любом случае, только с n = 2.

если вы используете стандартные методы библиотеки, такие как Collections.shuffle(), вы снова будете усложнять вещи, потому что стандартная библиотека использует генератор случайных чисел стандартной библиотеки.

обратите внимание, что все предложения (до сих пор) являются меньше эффективнее, чем простой nextBoolean() предложение, потому что они требуют лишних вызовов методов и арифметики.


другой способ сделать это-сохранить числа в список, перетасовать и взять первый элемент.

ArrayList<Integer> numbers=new ArrayList<Integer>();
numbers.add(35);
numbers.add(70);
Collections.shuffle(numbers);

numbers.get(0);

на мой взгляд, главная проблема здесь-энтропия для двух чисел, а не использование этой энтропии. Индексированный массив или boolean по существу одно и то же. Что еще вы можете сделать (и, надеюсь, это будет более случайным), это заставить Java дать вам случайное число между пределами, скажем, от 0 до 100. Теперь, если выбранное случайное число нечетно, вы выбираете int c = a. Pick b иначе. Я могу ошибаться, но выбор случайного между 0 и 100 кажется более случайным по сравнению с выбором случайного между двумя числа.


Вы можете просто использовать безопасный генератор случайных чисел(java.security.SecureRandom ).

try {
    r = SecureRandom.getInstance("SHA1PRNG");
    boolean b1 = r.nextBoolean(); 

    if (b1) {
        c = a;
    } else {
        c = b;
    }
} catch (NoSuchAlgorithmException nsae) {
    // Process the exception in some way or the other
}

обратитесь по этой ссылке для более информация


Рандомизируйте целое число от 1 до 10, если оно больше 5, то возьмите значение b другое мудрое идти с a. Насколько я знаю, нет других способов выбора из целых чисел.