A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ┣┫流枫 中级黑马   /  2014-8-5 11:49  /  2027 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ┣┫流枫 于 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   为什么出的结果是一样的

求大神指教





评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很给力!

查看全部评分

12 个回复

倒序浏览
random1和random2是两个对象,只不过相同的种子让它们产生的伪随机数序列中的对应元素是一样的。而你在第二个程序中只有random一个对象,多次next的效果是依次输出random序列中的每个数。也就是说,第一个程序中,你输出了两个相同序列的前10个数,第二个程序中,你输出了一个序列的前20个数
回复 使用道具 举报 1 0
fantacyleo 发表于 2014-8-5 11:54
random1和random2是两个对象,只不过相同的种子让它们产生的伪随机数序列中的对应元素是一样的。而你在第二 ...

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


回复 使用道具 举报
┣┫流枫 发表于 2014-8-5 12:22
random 和random2 有相同的种子   啥意思   他们都有new 啊  怎么是相同的种子那   

你的标题不就是“种子”吗,我还以为你知道new Random(10)中的10就是种子。。。new 创建对象,和种子没关系,一个概念不要随意扩大化理解。随机数种子就是一个初始条件,给一个条件,就产生一个随机数序列,给相同的条件,就产生相同的随机数序列
回复 使用道具 举报
说的很好
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 12:40
你的标题不就是“种子”吗,我还以为你知道new Random(10)中的10就是种子。。。new 创建对象,和种子没关 ...

我对种子不是很理解啊   能好好讲讲Random(10)  到底啥意思吗
回复 使用道具 举报
┣┫流枫 发表于 2014-8-5 13:15
我对种子不是很理解啊   能好好讲讲Random(10)  到底啥意思吗

知道数学中函数的概念吧?y=f(x),一个x,经过f变换,输出一个y。随机数种子也是一个道理,你给一个数,它背后有个公式,能算出一个数来,把这个算出来的数再代入公式,又算出一个数来,以此类推就能得到一个数字序列,随机数就是这么产生的。所以你给的种子一样,反复next得到的数字序列就是一样的。
回复 使用道具 举报
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  会记住上次的点  下次接着打印后面的  
所以输出的不一样是吗
回复 使用道具 举报
学习一下
回复 使用道具 举报
┣┫流枫 发表于 2014-8-5 13:39
哦哦   我还以为Random(10) 是产生十个确定的随机数那    刚才试了下 改成Random(1) 也输出好多。假象 ...

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

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

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

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

理解的还对吧
回复 使用道具 举报
┣┫流枫 发表于 2014-8-5 14:46
我开始就是不知道种子是啥  

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

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

涨知识了!多谢大师!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马