educoder随机数Java_Random类

Random类

Random类位于java.util包下,Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。

相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。

Random对象的生成

Random类包含两个构造方法,下面依次进行介绍:publicRandom()

该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。publicRandom(longseed)

该构造方法可以通过制定一个种子数进行创建。

示例代码:Randomr =newRandom();

Randomr1 =newRandom(10);

再次强调:种子数只是随机算法的起源数字,和生成的随机数字的区间无关。

验证:相同种子数的Random对象,相同次数生成的随机数字是完全相同的。packageeducoder;

importjava.util.Random;

publicclassRandomTest{

publicvoidrandom(){

inti =0;

intj =0;

Randomrandom =newRandom(1);

Randomrandom1 =newRandom(1);

i =random.nextInt();

j =random1.nextInt();

System.out.println("i:"+i +"\nj:"+j);

}

publicstaticvoidmain(String[]args){

RandomTesttt =newRandomTest();

tt.random();

}

}

输出结果:

第一次:

i:-1155869325

j:-1155869325

修改一下起源数字,让其等于100。Randomrandom =newRandom(100);

Randomrandom1 =newRandom(100);

输出结果:

i:-1193959466

j:-1193959466

Random类中的常用方法

Random类中的方法比较简单,每个方法的功能也很容易理解。需要说明的是,Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的。下面对这些方法做一下基本的介绍:packageeducoder;

importjava.util.Random;

publicclassRandomTest{

publicstaticvoidmain(String[]args){

Randomrandom =newRandom();

System.out.println("nextInt():"+random.nextInt());// 随机生成一个整数,这个整数的范围就是int类型的范围-2^31~2^31-1

System.out.println("nextLong():"+random.nextLong());// 随机生成long类型范围的整数

System.out.println("nextFloat():"+random.nextFloat());// 随机生成[0, 1.0)区间的小数

System.out.println("nextDouble():"+random.nextDouble());// 随机生成[0, 1.0)区间的小数

System.out.println("nextBoolean():"+random.nextBoolean());//随机生成一个boolean值,生成true和false的值几率相等,也就是都是50%的几率

System.out.println("nextGaussian():"+random.nextGaussian());//随机生成呈高斯(“正态”)分布的 double 值,其平均值是 0.0,标准差是 1.0

byte[]byteArr =newbyte[5];

random.nextBytes(byteArr);// 随机生成byte,并存放在定义的数组中,生成的个数等于定义的数组的个数

System.out.print("nextBytes():");

for(inti =0;i

System.out.print(byteArr[i]+"\t");

}

System.out.println();

/**

* random.nextInt(n)

* 随机生成一个正整数,整数范围[0,n),包含0而不包含n

* 如果想生成其他范围的数据,可以在此基础上进行加减

*

* 例如:

* 1. 想生成范围在[0,n]的整数

* random.nextInt(n+1)

* 2. 想生成范围在[m,n]的整数, n > m

* random.nextInt(n-m+1) + m

* random.nextInt() % (n-m) + m

* 3. 想生成范围在(m,n)的整数

* random.nextInt(n-m+1) + m -1

* random.nextInt() % (n-m) + m - 1

* ......主要是依靠简单的加减法

*/

System.out.println("nextInt(10):"+random.nextInt(10));// 随机生成一个整数,整数范围[0,10)

for(inti =0;i <5;i++){

System.out.println("我生成了一个[3,15)区间的数,它是:"+(random.nextInt(12)+3));

}

/**

* random.nextDouble()

* 例如:

* 1.生成[0,1.0)区间的小数

* double d1 = random.nextDouble();//直接使用nextDouble方法获得。

* 2.生成[0,5.0)区间的小数

* double d2 = random.nextDouble() * 5;//因为扩大5倍即是要求的区间。同理,生成[0,d)区间的随机小数,d为任意正的小数,则只需要将nextDouble方法的返回值乘以d即可。

* 3.生成[1,2.5)区间的小数

* double d3 = r.nextDouble() * 1.5 + 1;//生成[1,2.5)区间的随机小数,则只需要首先生成[0,1.5)区间的随机数字,然后将生成的随机数区间加1即可。

* ......同理,生成任意非从0开始的小数区间[d1,d2)范围的随机数字(其中d1不等于0),则只需要首先生成[0,d2-d1)区间的随机数字,然后将生成的随机数字区间加上d1即可。

*

*/

}

}

输出结果:

nextInt():1842341002

nextLong():4006643082448092921

nextFloat():0.88948154

nextDouble():0.5635189241159165

nextBoolean():false

nextGaussian():1.3191426544832998

nextBytes():36 100 94 14 -98

nextInt(10):1

我生成了一个[3,15)区间的数,它是:5

我生成了一个[3,15)区间的数,它是:10

我生成了一个[3,15)区间的数,它是:10

我生成了一个[3,15)区间的数,它是:11

我生成了一个[3,15)区间的数,它是:6

JDK1.8新增方法:packageeducoder;

importjava.util.Random;

publicclassRandomTest2{

/**

* 测试Random类中 JDK1.8提供的新方法 JDK1.8新增了Stream的概念 在Random中,为double, int,

* long类型分别增加了对应的生成随机数的方法 鉴于每种数据类型方法原理是一样的,所以,这里以int类型举例说明用法

*/

publicstaticvoidmain(String[]args){

Randomrandom =newRandom();

random.ints();// 生成无限个int类型范围内的数据,因为是无限个,这里就不打印了,会卡死的......

random.ints(10,100);// 生成无限个[10,100)范围内的数据

/**

* 这里的toArray 是Stream里提供的方法

*/

int[]arr =random.ints(5).toArray();// 生成5个int范围类的整数。

System.out.println(arr.length);

for(inti =0;i

System.out.println(arr[i]);

}

// 生成5个在[10,100)范围内的整数

arr =random.ints(5,10,100).toArray();

for(inti =0;i

System.out.println(arr[i]);

}

/**

* 对于 random.ints(); random.ints(ori, des);

* 两个生成无限个随机数的方法,我们可以利用Stream里的terminal操作,来截断无限这个操作

*/

// limit表示限制只要5个,等价于random.ints(5)

arr =random.ints().limit(5).toArray();

System.out.println(arr.length);

for(inti =0;i

System.out.println(arr[i]);

}

// 等价于random.ints(5, 10, 100)

arr =random.ints(10,100).limit(5).toArray();

for(inti =0;i

System.out.println(arr[i]);

}

}

}

输出结果:

5

1801462452

-1812435985

-1073912930

1160255210

-1342018704

80

54

16

67

82

5

-1161610558

283052091

797550518

-275356995

-1661722790

11

27

27

52

54

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值