Генерация случайного числа в диапазоне. Без переполнения. На яве

1

Пожалуйста, не отклоняйте это как дубликат: Как генерировать случайные положительные и отрицательные числа в java

Мне нужно использовать генератор случайных чисел с семенем. Итак, я использовал класс java.util.Random с конструктором, который принимает семя.

Random random = new Random(System.currentTimeMillis());

Затем я использовал решение, указанное в приведенной выше цепочке

int randomValue = random.nextInt(max - min + 1) + min;

Однако проблема с вышеприведенным решением состоит в том, что если min - большое отрицательное число, а max - большое положительное число, то (max - min + 1) приведет к переполнению.

Там должно быть лучшее решение. Может кто-нибудь, пожалуйста, назовите меня.

Спасибо!

  • 1
    Это действительно дубликат, если вы не предоставите больше информации.
  • 0
    Привет devnull, я предоставил информацию, почему она не является дубликатом. Причина (max - min + 1) может привести к переполнению.
Показать ещё 6 комментариев
Теги:
random

1 ответ

0

Как насчет использования BigInteger чтобы избежать переполнения int. Также вы можете использовать

new BigInteger(int numBits, Random rnd)

для создания некоторого BigInteger со случайными битами (до бит, указанного с помощью numBits).

Итак, просто вычислите, сколько бит вам нужно (range.bitLength() может быть полезно) проверьте, если рандомизированное значение указано в заданном диапазоне, поэтому, если значение больше, чем диапазон случайных снова, если все в порядке, возвращайте рандомизированное значение, увеличенное на min.

Вот пример кода

public static int myRandom(int min, int max, Random r){
    if (max <= min)
        throw new RuntimeException("max value must be greater than min value: max="+max +", min="+min);

    BigInteger maxB = BigInteger.valueOf(max);
    BigInteger minB = BigInteger.valueOf(min);

    BigInteger range = maxB.subtract(minB);
    do{
        BigInteger result = new BigInteger(range.bitLength(), r);
        if (result.compareTo(range)<=0)
            return result.add(minB).intValueExact();
    }while(true);
}
  • 0
    Результирующая случайная функция, вероятно, не будет равномерной.
  • 0
    @assylias Я не уверен, что понимаю, что вы подразумеваете под униформой (я не являюсь носителем английского языка: /), но из того, что я вижу в документации конструктора BigInteger (int numBits, Random rnd) " ... равномерно распределенного по диапазону От 0 до (2 ^ numBits - 1) ", так что вы можете сказать больше о проблеме с этим кодом? Я действительно сделал какую-то ошибку?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню