黑马程序员技术交流社区

标题: Random类——种子问题 [打印本页]

作者: ┣┫流枫    时间: 2014-8-5 11:49
标题: Random类——种子问题
本帖最后由 ┣┫流枫 于 2014-8-7 22:05 编辑

这是一个关于Random类的问题
对其中的种子不是很理解,详细见代码:
  1. import java.util.Random;
  2. public class Demo {

  3.         public static void main(String[] args) {
  4.                 Random random = new Random(10);
  5.                 Random random2 = new Random(10);
  6.                
  7.                 for (int i = 0; i < 10; i++) {
  8.                         System.out.print(random.nextInt(101)+",");
  9.                 }
  10.                 System.out.println();
  11.                
  12.                 for (int i = 0; i < 10; i++) {
  13.                         System.out.print(random2.nextInt(101)+",");
  14.                 }
  15.                
  16.         }

  17. }
复制代码

运行结果:
为什么两次的随机数是一样的。

很不明白为什么。。。。。。。。。


改变一下代码

  1. import java.util.Random;
  2. public class Demo {

  3.         public static void main(String[] args) {
  4.                 Random random = new Random(10);
  5.                
  6.                 for (int i = 0; i < 10; i++) {
  7.                         System.out.print(random.nextInt(101)+",");
  8.                 }
  9.                 System.out.println();
  10.                
  11.                 for (int i = 0; i < 10; i++) {
  12.                         System.out.print(random.nextInt(101)+",");
  13.                 }
  14.         }
  15. }
复制代码

运行结果:


这又是为什么.............
而且运行多次一直是这个结果


打印两次random  怎么出的结果不一样   
打印一次random一次random2   为什么出的结果是一样的

求大神指教






作者: fantacyleo    时间: 2014-8-5 11:54
random1和random2是两个对象,只不过相同的种子让它们产生的伪随机数序列中的对应元素是一样的。而你在第二个程序中只有random一个对象,多次next的效果是依次输出random序列中的每个数。也就是说,第一个程序中,你输出了两个相同序列的前10个数,第二个程序中,你输出了一个序列的前20个数
作者: ┣┫流枫    时间: 2014-8-5 12:22
fantacyleo 发表于 2014-8-5 11:54
random1和random2是两个对象,只不过相同的种子让它们产生的伪随机数序列中的对应元素是一样的。而你在第二 ...

random 和random2 有相同的种子   啥意思   他们都有new 啊  怎么是相同的种子那   



作者: fantacyleo    时间: 2014-8-5 12:40
┣┫流枫 发表于 2014-8-5 12:22
random 和random2 有相同的种子   啥意思   他们都有new 啊  怎么是相同的种子那   

你的标题不就是“种子”吗,我还以为你知道new Random(10)中的10就是种子。。。new 创建对象,和种子没关系,一个概念不要随意扩大化理解。随机数种子就是一个初始条件,给一个条件,就产生一个随机数序列,给相同的条件,就产生相同的随机数序列
作者: 沟门大杏    时间: 2014-8-5 12:42
说的很好

作者: ┣┫流枫    时间: 2014-8-5 13:15
fantacyleo 发表于 2014-8-5 12:40
你的标题不就是“种子”吗,我还以为你知道new Random(10)中的10就是种子。。。new 创建对象,和种子没关 ...

我对种子不是很理解啊   能好好讲讲Random(10)  到底啥意思吗
作者: fantacyleo    时间: 2014-8-5 13:29
┣┫流枫 发表于 2014-8-5 13:15
我对种子不是很理解啊   能好好讲讲Random(10)  到底啥意思吗

知道数学中函数的概念吧?y=f(x),一个x,经过f变换,输出一个y。随机数种子也是一个道理,你给一个数,它背后有个公式,能算出一个数来,把这个算出来的数再代入公式,又算出一个数来,以此类推就能得到一个数字序列,随机数就是这么产生的。所以你给的种子一样,反复next得到的数字序列就是一样的。
作者: ┣┫流枫    时间: 2014-8-5 13:39
fantacyleo 发表于 2014-8-5 13:29
知道数学中函数的概念吧?y=f(x),一个x,经过f变换,输出一个y。随机数种子也是一个道理,你给一个数, ...

哦哦   我还以为Random(10) 是产生十个确定的随机数那    刚才试了下 改成Random(1) 也输出好多。假象不成立。

也就是说Random(10)得到的是一个很长很长的  随机序列   
Random random = new Random(10);
Random random2=new Random(10);
是把一个随机序列的地址值给了random和random2  
所以输出的是一样的   


for (int i = 0; i < 10; i++) {
        System.out.print(random.nextInt(101)+",");
}
运行两次  nextInt  会记住上次的点  下次接着打印后面的  
所以输出的不一样是吗
作者: Franklin    时间: 2014-8-5 13:51
学习一下
作者: fantacyleo    时间: 2014-8-5 14:05
┣┫流枫 发表于 2014-8-5 13:39
哦哦   我还以为Random(10) 是产生十个确定的随机数那    刚才试了下 改成Random(1) 也输出好多。假象 ...

new的时候是不会产生那个随机序列的。毕竟序列是无限长的,这里用到了延迟计算的概念,每次调用next时才会计算序列中的一个数,不过这个细节没必要了解。只要记住,随机数是根据公式计算出来的,并非真正的随机。种子一样,代入公式算出来的结果就一样。
作者: ┣┫流枫    时间: 2014-8-5 14:46
fantacyleo 发表于 2014-8-5 14:05
new的时候是不会产生那个随机序列的。毕竟序列是无限长的,这里用到了延迟计算的概念,每次调用next时才 ...

我开始就是不知道种子是啥  

Random(种子)   里面的那个数就是种子

就像你说的y=f(x)的数学公式一样 ,
x是种子,f() 是计算公式    得到一个y 的随机序列

理解的还对吧

作者: fantacyleo    时间: 2014-8-5 14:59
┣┫流枫 发表于 2014-8-5 14:46
我开始就是不知道种子是啥  

Random(种子)   里面的那个数就是种子

嗯,就这么理解吧。细节说起来没底了
作者: paozhuanyinyu    时间: 2014-8-5 19:04
fantacyleo 发表于 2014-8-5 11:54
random1和random2是两个对象,只不过相同的种子让它们产生的伪随机数序列中的对应元素是一样的。而你在第二 ...

涨知识了!多谢大师!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2