2013-07-23 87 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

是的!感谢这非常丰富的答案! – angeloarenas

+0

我在想像这样: for循环语句的第三部分(增量)将是唯一一个每次都会循环的部分。我认为第二部分(条件语句)会运行一次,并且具有条件类型常量,就像for循环的第一部分(初始化int i = 0)一样。 但我明白现在循环如何工作,谢谢! – angeloarenas

3

在这段代码

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

变量i通过一个循环的每个迭代递增,但在给定的点我有一个小于'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循环语句的第三部分(增量)将是唯一一个每次都会循环的部分。我认为第二部分(条件语句)会运行一次,并且具有条件类型常量,就像for循环的第一部分(初始化int i = 0)一样。非常感谢你! – angeloarenas

2

Java文档说:

返回一个伪随机,均匀分布的int值介于0 (含)和指定值(不包括)

所以它是可能的值我可以大于nextInt()生成的随机数,循环结束。

当您在for循环的每次迭代中使用nextInt(1000)生成一个新随机数时,您将不会获得循环的固定值,并且它将不断变化,您的输出也会不断变化。

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

“第一个for循环”可能会给出小于100的输出数字,但并非总是如此,它会给出一系列从0到由Random.nextInt(1000)方法返回的随机数的数字。 ..

第一和第三循环方法的工作原理一样...

第二个会选择从0 9张的随机数到999,答案是喜欢,(373 472 7 56 344 423 764 722 554 800)