Я думаю, причина того, что вы получаете 8/9 цифровых значений и отрицательных чисел, заключается в том, что вы добавляете fraction
, long
(64-разрядное значение со знаком), которое может быть больше положительного int
диапазон (32-разрядное значение) до aStart
.
Значение переполняется, так что randomNumber
находится в отрицательном 32-битном диапазоне или почти обернуто до aStart
(поскольку int
является 32-битным значением со знаком, fraction
нужно будет только немного меньше (2 ^ 32 - aStart
), чтобы вы увидели 8 или 9-значные значения).
Вам необходимо использовать long
для всех значений.
private static void createRandomInteger(int aStart, long aEnd, Random aRandom){
if ( aStart > aEnd ) {
throw new IllegalArgumentException("Start cannot exceed End.");
}
//get the range, casting to long to avoid overflow problems
long range = aEnd - (long)aStart + 1;
logger.info("range>>>>>>>>>>>"+range);
// compute a fraction of the range, 0 <= frac < range
long fraction = (long)(range * aRandom.nextDouble());
logger.info("fraction>>>>>>>>>>>>>>>>>>>>"+fraction);
long randomNumber = fraction + (long)aStart;
logger.info("Generated : " + randomNumber);
}