2010-11-11 6 views
2
int totalRecs = getTotalRecs(); // returns '13' 
int MAX_RECS_PER_LOOKUP = 10; 
Random rand = new Random(); 
int start = (totalRecs > Utl.MAX_RECS_PER_LOOKUP) ? rand.nextInt(totalRecs-Utl.MAX_RECS_PER_LOOKUP) : 0; 
results = this.getNewRecs(filter, start, start+1); 

Я использую эту логику случайных чисел для извлечения записей из базы данных на основе их смещения строки таблицы (start до start+1).Почему мои случайные числа не так случайны?

Но по какой-то причине он продолжает повторять одни и те же цифры: start значения 0 и start значения 3.

Я попытался засева Random объект, но это не имеет никакого значения:

long seed = System.currentTimeMillis(); 
rand.setSeed(seed); 
+0

Что такое Utl.MAX_RECS_PER_LOOKUP? Вероятно, проблема не в rand.nextInt, а скорее ваши входы ограничивают ее крошечным подмножеством возможных ints. –

+2

Что-то очень странное. Если totalRecs действительно 13, то вы не должны получать 3 (поскольку вы передаете 3 на nextInt, и это эксклюзивный верхний предел). Можете ли вы попробовать распечатать значение totalRecs и проверить, что вы думаете? Почему вы используете Utl.MAX_RECS_PER_LOOKUP, а не MAX) RECS_PER_LOOKUP, который вы только что установили? –

ответ

3

Метод rand.nextInt(n) возвращает значение в диапазоне от 0 (включительно) и п (исключительное).

В вашем коде, если totalRecs является 13, и Utl.MAX_RECS_PER_LOOKUP 10 (я предполагаю, что это один на основе значения MAX_RECS_PER_LOOKUP в фрагменте кода, но я могу ошибаться), то этот код:

rand.nextInt(totalRecs-Utl.MAX_RECS_PER_LOOKUP); 

должно возвращать случайное число от 0 до 2.

Я не уверен, действительно ли это то, что вы на самом деле хотите?

-1

Вы можете попробовать java.security.SecureRandom

Это кажется хорошей альтернативой, и он наследует от java.util.Random

0

Убедитесь, что ваши данные корректны.

Via отлаживать сравнить значения

totalRecs Utl.MAX_RECS_PER_LOOKUP & начать на одной и той же итерации.

Вы звоните

rand.nextInt(totalRecs-Utl.MAX_RECS_PER_LOOKUP) 

Единственный путь, вы должны «всегда» получать 0, если totalRecs = Utl.MAX_RECS_PER_LOOKUP Однако если разница только 1, то вы получите обратно 0 или 1 случайным образом.

Смежные вопросы