种子,随机数,并使用java.uitl.Random绑定

时间:2016-02-15 23:26:43

标签: java random

(1)所以我首先想到一个种子是随机数开始的,正如书中所说"一个用于初始化随机数生成器的数字"。随机数应该从种子开始,这是不是这样的。请解释一下。

(2)使用seed和java API java.util.Random,我想生成10个绑定300-1000的随机数。但是,下面的代码给了我所有相同的数字:

import java.util.*;
public class RandomClassTest {

public static void main(String [] args) {
    Random rd = new Random(300);
    int randInt = rd.nextInt(1000-300)+300;
    int count = 1;

    while( count <= 10) {
        System.out.println(randInt);
        count++;
        }
     }  
   }   

My output:
743
743
743
743
743
743
743
743 
743
743 
// all the time same output without any variation 

6 个答案:

答案 0 :(得分:1)

种子不一定是PRNG生成的随机数序列中的第一个数字。种子仅用于初始化随机数生成器,随机。基本上&#34;伪&#34;意味着数字根本不是随机的,而只是看起来是随机的。它们只是由先前生成的数字(或多或少)复杂函数生成的。种子的目的是作为起点,PRNG可以从中开始创建数字。序列是以种子作为第一个输出编号还是不是以特定于实现的方式开始,但出于简单的安全原因,建议不要将种子作为第一个输出编号开始。

请注意,使用相同代码和种子的两个PRNG产生完全相同的数字序列 - 可能会有一些巧合的副作用会改变结果。

作为在PRNG中使用种子的示例,请看一下XORShift的这个实现,这是一个相当简单的PRNG:

class XORShift{
    private int x, y, z, w;

    public XORShift(int seed){
        x = seed;
        y = seed >>> 20 | seed << 12;
        z = seed >>> 10 | seed << 22;
        w = seed >>> 25 | seed << 7;
    }

    public int next() {
        int t = x;
        t ^= t << 11;
        t ^= t >> 8;
        x = y; y = z; z = w;
        w ^= w >> 19;
        w ^= t;
        return w;
    }
}

如您所见,种子用于初始化生成器的状态变量,然后在每个步骤中对其进行更改并组合以生成新的随机数。上面的算法只是维基百科上的示例代码到java的翻译,你在c / c ++中找到了几乎相同的代码。

答案 1 :(得分:0)

你打印过十次相同的号码。你循环应该是这样的。

public static void main(String [] args) {
    Random rd = new Random(300);    
    int count = 1;
    while( count <= 10) {
        int randInt = rd.nextInt(1000-300)+300;
        System.out.println(randInt);
        count++;
    }         
} 

答案 2 :(得分:0)

好的,您的代码存在一些问题。

<强>首先

确实没有&#34;纯随机&#34;但只有&#34;伪随机&#34;这意味着所有随机数实际上只是一个预定的数字序列,而种子所做的是它实际上告诉代码从哪里开始长数字列表。例如

1 
10 
4 
5 
2 
7 
3 
29 
8 
2 

是我的&#34;列表&#34;随机数。

1的种子意味着我将取第一个数字:1然后我的下一个&#34;随机&#34;数字将是10然后4 ..如果我有2的种子,那么我将从10然后4然后5等等开始。

一般来说,您将使用Time.Now填充随机种子,以便在每次运行代码时获得不同的结果。现在,如果您尝试一次又一次地运行代码......每次都会得到 SAME 编号。现在,它不是很随机吗?

<强>第二

你的代码中的下一个错误是int randInt = rd.nextInt(1000-300)+300;在你的循环之外,这是实际获得下一个&#34;随机&#34;的代码。号。

您需要将该行放入循环中以获得不同的随机数。

答案 3 :(得分:0)

您的变量randInt对于所有迭代都具有相同的值。 你应该把它放在循环体中:

public static void main(String [] args) {
    Random rd = new Random(300);
    int count = 1;

    while( count <= 10) {
        int randInt = rd.nextInt(1000-300)+300;
        System.out.println(randInt);
        count++;
        }
     }  
   }  

答案 4 :(得分:0)

您没有更改号码,将randInt = rd.nextInt(1000-300)+300;放在您的循环中

答案 5 :(得分:0)

尝试在while循环中放置int randInt = rd.nextInt(1000-300)+300;时使用它:

   int count = 1;
   Random rd = new Random(300);
   while( count <= 10) {
    int randInt = rd.nextInt(1000-300)+300;
    System.out.println(randInt);
    count++;
    }
 }