`
nuistcc
  • 浏览: 83588 次
社区版块
存档分类
最新评论

Random rand = new Random(47);

阅读更多
这句代码在Thinking in java中很常见
Random rand = new Random(47);

但是下面两句代码放在一起就会有点晕了
Random rand = new Random(47);
int i = rand.nextInt(100);

生成的随机数范围到底是什么,是0-47还是0-100,跟47和100又有什么关系。
下面对Random()的一些简单理解做一些说明吧。

伪随机数
对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。
伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。
伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。
一般地,我们使用同系统时间有关的参数作为随机种子。

Random对象的生成
Random类包含两个构造方法,下面依次进行介绍:
(1)public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
 public Random() { this(++seedUniquifier + System.nanoTime()); }
 private static volatile long seedUniquifier = 8682522807148012L;

(2)public Random(long seed)
该构造方法可以通过制定一个种子数进行创建。
Random r = new Random(10);

切记,种子数只是随机算法的起源数字,和生成的随机数字的区间无关!

随机种子对结果的影响
(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定
选取随机种子为47,随机数最大值为20.
下面代码运行10次的结果总是为18.
public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Random rand = new Random(47);
            int j = rand.nextInt(20);
            System.out.println(j);
        }
    }

(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18
public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Random rand1 = new Random(47);
            Random rand2 = new Random(47);
            int j = rand1.nextInt(20);
            int k = rand2.nextInt(20);
            System.out.println(j);
            System.out.println(k);
        }
    }

(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13.
但每次循环的结果都一样,18,15,13会被顺序循环输出。
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。
 public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Random rand = new Random(47);
            int j = rand.nextInt(20);
            int k = rand.nextInt(20);
            int p = rand.nextInt(20);
            System.out.println(j);
            System.out.println(k);
            System.out.println(p);
        }
    }


总结
最后结合API中的说明,再简要总结下Random()方法的功能:
(1)java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;
(2)相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
(3)Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;

写在最后
至于为什么随机种子在think in java中总是选47,看完上面的解释,可以简单理解为作者认为47是一个幸运数字或“魔数”吧
分享到:
评论

相关推荐

    飞机大战 源码

    Random rand = new Random(); int type = rand.nextInt(20); //随机生成0到19之间的值 if(type == 0){ return new Bee(); //生成蜜蜂对象 }else{ return new Airplane(); //生成敌机对象 } }

    java产生随机数的几种方式

    Random rand = new Random(); int randomInt = rand.nextInt(100) + 1; ``` 3. **使用 Seeds** 在 `Random` 类中,可以传入一个种子值来初始化随机数生成器。相同的种子会产生相同的随机数序列,这对于测试和...

    random 猜数字

    Random rand = new Random(); int randomNumber = rand.nextInt(100) + 1; ``` 接下来,"猜数字"这个游戏的核心就是用户与程序之间的交互。在JSP中,这通常通过HTTP请求和响应进行。用户在网页上输入他们的猜测,...

    JSP.rar_JSP rand_JSPrandom_jsp random_jsp开发_random

    Random rand = new Random(); int randomNumber = rand.nextInt(100) + 1; %&gt; ``` 这里的`nextInt(100)`会生成0到99之间的随机整数,但我们希望生成的是1到100之间的,所以加上1。 生成随机数后,我们可以将其...

    C语言的小笔记

    Random rand = new Random(); rand.Next(1,4); Student abc= new Student(); 调用: 调属性 对象名.属性=值; 调方法 对象名.方法名(); . 成员运算符: “的” 定义一个类 class 类名{ //成员变量 数据类型 变量名...

    Java 产生不重复随机数四种方法

    Random rand = new Random(); HashSet&lt;Integer&gt; uniqueSet = new HashSet(n); while (uniqueSet.size() ) { int randomNum = rand.nextInt(n); // 在0到n-1之间生成随机数 uniqueSet.add(randomNum); } ...

    c#如何更快更准的生成随机数

    Random rand = new Random(); Console.WriteLine(rand.Next()); } ``` 这段代码展示了如何使用`Random`类生成一个32位的随机整数。`rand.Next()`方法默认返回介于0(包含)和`Int32.MaxValue`(不包含)之间的...

    生成随机字符串(字符串,数字)

    Random rand = new Random(); for (int i = 0; i ; i++) { char randomChar = alphabet[rand.Next(alphabet.Length)]; sb.Append(randomChar); } string randomString = sb.ToString(); ``` 如果你想生成包含数字...

    c#编写两个枚举CardColor和CardRank,分别表示扑克牌花色和级别。随机生成1张扑克牌,输出对应的各枚举值。

    Random rand = new Random(); int colorIndex = rand.Next(0, Enum.GetNames(typeof(CardColor)).Length); CardColor randomColor = (CardColor)colorIndex; int rankIndex = rand.Next(0, Enum.GetNames...

    randomnum_random_源码

    Random rand = new Random(); return rand.nextInt(100); } } ``` `nextInt(int bound)`方法接受一个参数`bound`,生成的随机数会在0(包含)到`bound`(不包含)之间。 测试这段代码,我们通常会在`Test.java`...

    JSP数据库通用模块开发与系统移植

    Random random = new Random(); if(fc&gt;255) fc=255; if(bc&gt;255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } %...

    java随机码生成程序

    Random rand = new Random(); int randomNum = rand.nextInt(100) + 1; ``` 若需要生成随机字符串,我们可以利用`char`数组和字符集。例如,创建一个包含大小写字母和数字的8位随机字符串: ```java String ...

    Random—产生不同的随机数

    Random rand = new Random(); int[] randomNumbers = new int[10]; for (int i = 0; i &lt; randomNumbers.length; i++) { randomNumbers[i] = rand.nextInt(100); // 在0到99之间生成随机整数 } ``` 数组的拷贝和...

    只用三行代码就从一千个数字随机选出了一百个不同的数字!

    Random rand = new Random(); int randomNumber = rand.nextInt(1000); // 生成0到999之间的随机数 System.out.println(randomNumber); } } ``` 然而,仅仅生成随机数并不能满足题目要求,我们还需要确保这100...

    java模拟掷骰子2个源码示例

    Random rand = new Random(); int dice1 = rand.nextInt(6) + 1; int dice2 = rand.nextInt(6) + 1; System.out.println("第一个骰子的点数是: " + dice1); System.out.println("第二个骰子的点数是: " + ...

    jsp-quis.rar_random

    Random rand = new Random(); this.randomNumber = rand.nextInt(100) + 1; // 生成1到100的随机数 } public int getRandomNumber() { return randomNumber; } } ``` 然后,在JSF的视图层(通常是XHTML页面...

    caishuzi.zip_猜数字

    Random rand = new Random(); int randomNumber = rand.nextInt(100) + 1; ``` 3. **用户交互**:Java标准库提供了`java.util.Scanner` 类来读取用户输入。使用`Scanner(System.in)`可以从控制台接收用户输入,...

    java获取随机数的3种方法和总结.docx

    Random rand = new Random(); int randomNum = rand.nextInt(max - min + 1) + min; ``` 这个方法的优势在于可以生成各种类型的随机数,如浮点数、双精度数、长整型等。 3. **方法3:Random类的构造函数与种子*...

    在Java中产生随机数的两个方法

    Random rand = new Random(System.currentTimeMillis()); ``` #### 方法比较 - **性能方面**:`java.util.Random`类比`Math.random()`具有更好的性能,特别是在需要大量生成随机数的情况下。 - **灵活性方面**:...

    N位随机数的生成

    1. `Random`类的实例化:`Random rand = new Random();`,这是生成随机数的起点。 2. `nextInt()`方法的使用:`rand.nextInt((int)Math.pow(10, N))`,这里的Math.pow()用于计算10的N次方,然后将其转换为整数并传递...

Global site tag (gtag.js) - Google Analytics