2013-07-23 5 views
0

У меня есть эта проблема, которую я наблюдал при генерации чисел как условие в цикле for. Я использую это в своей программе для Android.Генерация случайного числа циклов

Когда я делаю это:

String temp = ""; 
for (int i = 0; i < new Random().nextInt(1000); i++) { 
    temp += i + " "; 
} 

Я всегда получаю не более 100

Но когда я делаю это:

for (int i = 0; i < 10; i++) { 
    temp += new Random().nextInt(1000) + " "; 
} 

Я получил реальные случайные числа в диапазоне от 0 до 999 .

Что на самом деле происходит?

Я знаю, что я мог бы сделать это:

int x = new Random().nextInt(1000); 
for (int i = 0; i < x; i++) { 
    temp += i + " "; 
} 

И это делает возвращение случайных чисел 0-999. Но я просто хочу понять, почему первый код возвращает только номера не более 100.

+0

Ваш первый цикл до тех пор, пока 'i' не будет больше случайного числа, и это случайное число будет регенерировано на каждой итерации. Ваш второй генерирует 10 случайных чисел. Ваша последняя генерирует последовательность чисел, идущую от 0 до случайного числа. Все они совершенно разные, и вы не указали, что хотите. –

ответ

1

Ваша первая реализация ...

for (int i = 0; i < new Random().nextInt(1000); i++) { 
    temp += i + " "; 
} 

зовет new Random().nextInt(1000) в конце каждой итерации, чтобы определить, является ли это время для завершения цикла. Тот же код можно переписать следующим образом:

int i = 0; 
while (i < new Random().nextInt(1000)) { 
    temp += i + " "; 
    i++; 
} 

, который может быть лучше проиллюстрировать ...

int i = 0; 
while (true) { 
    if (i < new Random().nextInt(1000)) { 
     break; 
    } 
    temp += i + " "; 
    i++; 
} 

так, хотя значение i постоянно растет, число, против которого сравнивается new Random().nextInt(1000) постоянно меняется. Ваши сравнения может выглядеть следующим образом ...

if (0 < 981) break; 
if (1 < 27) break; 
if (2 < 523) break; 
if (3 < 225) break; 
if (4 < 198) break; 
if (5 < 4) break; 

В приведенном выше примере, даже при том, что первый вызов new Random().nextInt(1000) возвращается колоссальные 981, цикл происходит только в 5 раз, потому что в начале 6-го итерации, new Random().nextInt(1000)4, что составляет менее 5 текущее значение i.

Надеюсь, это поможет!

+0

+1 для пояснения, хотя randow создается с ** началом ** каждой итерации , –

+0

Yup получил! Спасибо за этот очень информативный ответ! – angeloarenas

+0

Я думал что-то вроде: Третья часть (приращение) в операторе цикла for будет единственной, которая будет циклироваться каждый раз. Я думал, что вторая часть (оператор условия) будет выполняться один раз и будет иметь вид условия константы, как и первая часть (инициализация int i = 0) цикла for. Но я понял, как работает петля, спасибо! – angeloarenas

3

В этом коде

for (int i = 0; i < new Random().nextInt(1000); i++) { 
    temp += i + " "; 
} 

переменная я увеличивается на единицу для каждой итерации цикла, но в данный момент времени, когда i < 100, существует вероятность того, что число, меньшее, чем «i», генерируется случайным образом, и, таким образом, цикл выходит.

2

вы должны инициализировать случайную переменную перед циклом

int max = new Random().nextInt(1000); 
String temp = ""; 
for (int i = 0; i < max; i++) 
{  temp += i + " "; } 
4
for (int i = 0; i < new Random().nextInt(1000); i++) { // here upper limit of i will change time to time. 
    temp += i + " "; 
} 

.

for (int i = 0; i < 10; i++) { // here i increase up to 10 
    temp += new Random().nextInt(1000) + " "; 
} 

.

int x = new Random().nextInt(1000); // here x is random but this will never change while for loop is running 
for (int i = 0; i < x; i++) { 
    temp += i + " "; 
} 
+0

О! Ладно, спасибо, я понял! Я думал, что третья часть (приращение) в операторе цикла for будет единственной, которая будет циклироваться каждый раз. Я думал, что вторая часть (оператор условия) будет выполняться один раз и будет иметь вид условия константы, как и первая часть (инициализация int i = 0) цикла for. Большое спасибо! – angeloarenas

2

Java Doc говорит:

Возвращает псевдохаотическом равномерно распределенную значение INT между 0 (включительно) и заданное значение (исключительное)

Так что возможно, что значение i может быть больше, чем случайный, сгенерированный nextInt(), и петля завершается.

Как вы создаете новое Случайное генерируется с использованием nextInt(1000) на каждой итерации цикла for, вы не получите фиксированного значения для цикла, и оно будет меняться, и ваш результат будет изменен.

String temp = ""; 
for (int i = 0; i < new Random().nextInt(1000); i++) { //new random nextInt() called on each iteration 
    temp += i + " "; 
} 

Примечание: Моя программа побежал до 64

0

Здесь

String temp = ""; 
for (int i = 0; i < new Random().nextInt(1000); i++) { 
     temp += i + " "; 
    } 

я может быть больше, чем 100, но вероятностно практически невозможно. Да!

+0

На самом деле я работал, и это должно произойти 1 раз в 186 раз. Вероятность 999/1000 * 998/1000 * ... * 900/1000 –

+0

5.95e-6 = практически невозможно :) – mromer

0

«Первый цикл» может выдавать номера выходных данных менее 100, но не всегда, будет давать ряд чисел от 0 до случайного числа, которое возвращается методом Random.nextInt (1000) .. ..

1-й и 3-й методы Сквозные работает так же ...

Но второй один подберут 9 случайных чисел от 0 до 999, и ответ, как, (373 472 7 56 344 423 764 722 554 800)

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