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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏天 初级黑马   /  2012-9-11 11:38  /  4800 人查看  /  19 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 夏诗瑶 于 2012-9-11 14:22 编辑

之前用随机数,一直是用 Math.random()方法。

刚看到一题。
  Random r1 = new Random(100);
  int n1 = r1.nextInt(20);
  Random r2 = new Random(100);
  int n2 = r2.nextInt(20);
  System.out.println(n1);
  System.out.println(n2);
试运行了下,发现n1和n2的值竟然是固定,且相等的。

关于Random的用法,和Math.Random的比较,已及上一题的分析讲解。望各位大神不吝赐教。
ps:别嫌小弟菜~~

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

19 个回复

倒序浏览
你可以看看这个帖子就明白了
回复 使用道具 举报
回复 使用道具 举报
值相同能理解,可为什么 n1,n2的值不可能同时是25.(这是一个选择题,问不可能是下列哪个选项,其中有同时是25)
回复 使用道具 举报
你们讲的 真仔细啊
回复 使用道具 举报
int n2 = r2.nextInt(20); 这句话返回的是0~20不包括20的伪随机数

回复 使用道具 举报
夏天 初级黑马 2012-9-11 12:34:09
7#
完全OK了
回复 使用道具 举报
Random:
你只要记住实例化Random对象时,构造方法不可以传参数就是了(或者传System.currentTimeMillis()方法的返回值),否则每次都会取得同样的数.

Math.Random:
和Random使用起来没啥区别,只不过Math.Random只能返回0到1的小数,而Random可以返回好几种基本数据类型.
回复 使用道具 举报
夏诗瑶 发表于 2012-9-11 11:48
值相同能理解,可为什么 n1,n2的值不可能同时是25.(这是一个选择题,问不可能是下列哪个选项,其中有同时 ...

n1和n2可以同时是25.
回复 使用道具 举报
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。
回复 使用道具 举报
Random  randomGen=new Random(seed);
seed 随机数生成算法的所需的"种子".为生成一个随机数性较好的数序列,种子最好是一个质数。
也可以用下列的方式进行实例化该对象:
Random  randomGen=new Random();
对于没有参数的构造方法,就是默认以当前的时间为种子.
Random 提供了一个方法可以得到特定范围内的整数,下面这个例子返回一个随机数,并将其存放在一个变量中。
    int number1=randomGen.nextInt(limit);
limit 要比实际上的限制大于1,下限值为0,当limit为100时,我们就得到[0,99] 之间的随机数。
   例子:
  public class TestRandom{

           final int limit=100;//希望产生[0,,99]之间的随机数
           final int seed=17;
           Random  randomGen=new  Random(seed);
           int number1=randomGen.nextInt(limit);
           int number2=randomGen.nextInt(limit);
           int number3=randomGen.nextInt(limit);
           System.out.println("产生3个[0,99]之间的随机数"+number1+","+number2+","+number3);
-------------------------------------------------------------
static double random()
          返回带正号的 double 值,大于或等于 0.0,小于 1.0。
回复 使用道具 举报
夏诗瑶 发表于 2012-9-11 13:13
不可以的,20限定了范围。。马哥。。

我知道啊,你把最大数设置为20,当然不会有出现25的可能性,这个还需要问吗.
我的意思是有办法让它们同时都为25.你把20改为30,种子100不动就一直是25了.
回复 使用道具 举报
杨习平 发表于 2012-9-11 14:04
Random  randomGen=new Random(seed);
seed 随机数生成算法的所需的"种子".为生成一个随机数性较好的数序列 ...

你好,你的方法能获得三个不同的随机数,可是我的问题中,为什么随机数n1和n2的值相同呢。
回复 使用道具 举报
夏诗瑶 发表于 2012-9-11 14:22
你好,你的方法能获得三个不同的随机数,可是我的问题中,为什么随机数n1和n2的值相同呢。 ...

因为你的n1和n2是分别用的两个Random对象来生成的,而人家是只有一个Random对象生成三个值.
回复 使用道具 举报
  Random r1 = new Random(100);
  int n1 = r1.nextInt(20);
  Random r2 = new Random(100);
-------------------------------------------------
   final int limit=100;//希望产生[0,,99]之间的随机数
           final int seed=17;
           Random  randomGen=new  Random(seed);
           int number1=randomGen.nextInt(limit);
           int number2=randomGen.nextInt(limit);
           int number3=randomGen.nextInt(limit);
我以为你能看明白,你是想错了。正因为你的是一样的啊,我才这样写了不一样的
你是这样 Random r1 = new Random(100); Random r2 = new Random(100);
相当于你弄了两次种子,但是都是100.他执行的时候是两个[0.99],所以出来的随机数自然
一样。
我是定义了一个啊,看清楚。他出来的值就必须是在一个[0,99]之间产生随机数,当然是
不一样的了。清楚吧。
回复 使用道具 举报
杨习平 发表于 2012-9-11 14:54
Random r1 = new Random(100);
  int n1 = r1.nextInt(20);
  Random r2 = new Random(100);

其实 我还不是很明白  Random r1 = new Random(100);
  int n1 = r1.nextInt(20);
第二句话不应该是从第一句话产生的数序列中 随即获得在[0,19] 的数吗。。
不管我弄几次种子,后面的.nextInt(20);产生的数 不是应该都是数序列中的随机数吗?
也就是说,为什么就不随机了。。。
谢谢了~~~
回复 使用道具 举报
你可以仔细看看java文档的Random类,
“如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证此属性的实现,为类 Random 指定了特定的算法。”

你指定了Random(100)里面100这个种子,r1.nextInt(20)返回的是某个固定值,也就是你说的不随机的原因,你可以改成r1.nextInt(19),它也永远返回一个固定值

指定了种子之后,它里面通过某种算法,返回的是固定值

回复 使用道具 举报
夏诗瑶 发表于 2012-9-11 19:51
其实 我还不是很明白  Random r1 = new Random(100);
  int n1 = r1.nextInt(20);
第二句话不应该是从第 ...

你怎么就这么转不过弯呢,你在实例化Random对象时,不要给构造方法传参数不就行了吗.
回复 使用道具 举报
宁振庄 发表于 2012-9-11 20:08
你可以仔细看看java文档的Random类,
“如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方 ...

这次真明白了。。。
回复 使用道具 举报
首先说说Math,Math包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。Math中random方法返回带正号的 double 值,该值大于等于 0.0 且小于 1.0,是一个double类型,毕竟,Math的主要职责是进行数学运算。
Random:
①此类的实例用于生成伪随机数流,专门用于进行随机数操作,可以获取int,long,double,float,boolean类型的随机数;
②如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。
③Random 类实现的算法使用一个 protected 实用工具方法,每次调用它最多可提供 32 个伪随机生成的位。 很多应用程序会发现 Math.random() 方法更易于使用。
nextInt(int n)方法返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。

上述n1和n2之所以相等,是因为Random类的第②点,特别需要注意。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马