关于Random(47)与randon.nextInt(100)的区别

参考https://blog.csdn.net/md_shmily92/article/details/44059313

Java中Random也称为伪随机函数。

这句代码在Thinking in java中很常见

Java代码

  1. Random rand = new Random(47);

但是下面两句代码放在一起就会有点晕了

Java代码

  1. Random rand = new Random(47);
  2. int i = rand.nextInt(100);  //产生的随机数 不包括100,最大到99,

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

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

Random对象的生成 
Random类包含两个构造方法,下面依次进行介绍: 
(1)public Random() 
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。

Java代码

  1. public Random() { this(++seedUniquifier + System.nanoTime()); }
  2. private static volatile long seedUniquifier = 8682522807148012L;

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

Java代码

  1. Random r = new Random(10);

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

随机种子对结果的影响 
(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定 
选取随机种子为47,随机数最大值为19. 
下面代码运行10次的结果总是为18.

Java代码

  1. public static void main(String[] args) {
  2. for (int i = 0; i < 10; i++) {
  3. Random rand = new Random(47);
  4. int j = rand.nextInt(20);
  5. System.out.println(j);
  6. }
  7. }

(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定 
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18

Java代码

  1. public static void main(String[] args) {
  2. for (int i = 0; i < 10; i++) {
  3. Random rand1 = new Random(47);
  4. Random rand2 = new Random(47);
  5. int j = rand1.nextInt(20);
  6. int k = rand2.nextInt(20);
  7. System.out.println(j);
  8. System.out.println(k);
  9. }
  10. }

(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同 
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13. 
但每次循环的结果都一样,18,15,13会被顺序循环输出。 
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。

Java代码

  1. public static void main(String[] args) {
  2. for (int i = 0; i < 10; i++) {
  3. Random rand = new Random(47);
  4. int j = rand.nextInt(20);
  5. int k = rand.nextInt(20);
  6. int p = rand.nextInt(20);
  7. System.out.println(j);
  8. System.out.println(k);
  9. System.out.println(p);
  10. }
  11. }

产生特定区间的随机值

如产生5-26之间的随机值,为rand.nextInt(26-5+1)+5;

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

(4) 47是一个产生随机数的魔法数字,这个问题到现在都没人能够解释,只是经过很多次试验得到的,包括《Thinking in java》的作者布鲁斯.艾克尔也这么提到:由47做种后,产生的随机数更加体现了随机性。它没有什么具体的意义,只要理解随机数如果有一个种子,哪么出现了比较随即的随机数,而当种子是47的时候,随即率是最大的。

原文地址:https://www.cnblogs.com/lijingran/p/8997892.html

时间: 2024-10-13 05:54:05

关于Random(47)与randon.nextInt(100)的区别的相关文章

例4-7 求1!+2!+…+100!

例4-7 求1!+2!+-+100! 计算 1!+2!+-+100! 程序核心--两个循环的镶嵌 程序 #include<stdio.h> int main() { int i,j,n; double sum,result; sum=0; for(i=1;i<=100;i++) { result=1; for(j=1;j<=i;j++) result*=j; sum=sum+result; } printf("1!+2!+-+100!=%e\n",sum); r

Java编程思想 Random(47)

Random类包含两个构造方法,下面依次进行介绍:1. public Random()该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象.2. public Random(long seed)该构造方法可以通过制定一个种子数进行创建.示例代码:Random r = new Random();Random r1 = new Random(10);Random r2 = new Random(10);强调一下:做为种子的数字只是随机算法的起源数

auto和100%的区别

auto是随内容的高度而撑开的.100%是根据父级元素的高度来决定的.例如: <div style="height:100px;width:200px;"> <div style="height:auto;width:100px;float:left;">这个容器的高度是随里面的内容的高度而定</div> <div style="height:100%;width:100px;float:right;"&

MySql中varchar(10)和varchar(100)的区别==&gt;&gt;以及char的利弊

一般初学会认为,二者占用的空间是一样的.比如说我存储5个char,二者都是实际占用了5个char了[勘误:varchar在实际存储的时候会多一个byte用来存放长度].但是深入一下,设计数据库的时候,二者一样吗?答案是否定的[至少varchar类型需要在数据之前利用一个或者两个字节来存储数据的长度][二者在内存中的操作方式也是不同的,下面的例子中有体现].看下面的例子.如现在用户需要存储一个地址信息.根据评估,只要使用100个字符就可以了.但是有些数据库管理员会认为,反正Varchar数据类型是

background-size值为cover和值为100%的区别

background-size:100%和background-size:cover的区别?background-size:100%---按容器比例撑满,图片变形:background-size:cover---把背景图片放大到适合元素容器的尺寸,图片比例不变.IE8及以下版本用滤镜来兼容background-size如下:filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='bg.jpg', sizingMethod='s

border-radius:50%和100%的区别

border-radius 值类型-百分比 border-radius的值是百分比的话,就相当于盒子的宽度和高度的百分比. 我们知道在一个正方形内做一个面积最大的圆形,这个圆的半径就为正方形边长的一半.所以border-radius为50%时,则会形成圆.那么可能有人就会问,border-radius为100%时,对应圆的半径长度不就是正方形的宽高么,这种情况下,为什么还是会形成一个和值为50%一样的圆形呢. 其实这是W3C对于重合曲线有这样的规范:如果两个相邻角的半径和超过了对应的盒子的边的长

Java中nextLine()与其他next(),nextInt(),nextFloat()的区别

最近学习Java过程中遇到一个小问题,就是用nextInt()来接收输入内容时,按完回车之后会产生后面的内容无法输入的结果,因此来做个小记录.有不足的地方还请大家指出. 区别一  读取返回结果 nextInt()读取结果为int类型 nextFloat()读取结果为float类型 next()读取结果为String类型 next Line()读取结果为String类型 区别二  读取方式 next(),nextInt(),nextFloat()看到空格符或回车符都认为读取结束,此时不会读取回车符

java中random()函数用法介绍

Random() 创建一个新的随机数生成器.  代码如下 复制代码 Random(long seed) 使用单个 long 种子创建一个新的随机数生成器. 我们可以在构造Random对象的时候指定种子,如:  代码如下 复制代码 Random r1 = new Random(20); 或者默认当前系统时间对http://www.111cn.net/jsp/Java/45403.htm 应的相对时间有关的数字作为种子数:  代码如下 复制代码 Random r1 = new Random(); 种

java学习--基础知识第四天-- Random、数组

今日内容介绍 u Random u 数组 第1章 Random 1.1 产生整数随机数 1.1.1 Random的使用步骤 我们想产生1~100(包含1和100)的随机数该怎么办呢? 我们不需要自己去写算法,因为Java已经为我们提供好了产生随机数的类---Random: 作用: – 用于产生一个随机数 ? 使用步骤(和Scanner类似) – 导包 ? import java.util.Random; – 创建对象 ? Random r = new Random(); – 获取随机数 ? in