Пожалуйста, не отклоняйте это как дубликат: Как генерировать случайные положительные и отрицательные числа в java
Мне нужно использовать генератор случайных чисел с семенем. Итак, я использовал класс java.util.Random с конструктором, который принимает семя.
Random random = new Random(System.currentTimeMillis());
Затем я использовал решение, указанное в приведенной выше цепочке
int randomValue = random.nextInt(max - min + 1) + min;
Однако проблема с вышеприведенным решением состоит в том, что если min - большое отрицательное число, а max - большое положительное число, то (max - min + 1) приведет к переполнению.
Там должно быть лучшее решение. Может кто-нибудь, пожалуйста, назовите меня.
Спасибо!
Как насчет использования 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);
}