Java产生随机数从广义来讲,大概有三种:
1、通过System.currentTimeMillis()来获取一个当前时间毫秒的long型数字
【Ps:这个方法返回一个从1970年1月1日0点0分0秒到当前的一个毫秒数,返回类型是long型,所以这个返回值是每时每刻都是在变化的,因为1970年的1月1日刚好是星期一,比较好算时间,一般可以用来程序运行的速度,如下:】
package javaDemo2;
/**
*
* 产生随机数的小测试和总结
* @author Monster丶ZF
* @version1.8
* @data 2019年4月4日
* @remakeTODO
*/
public class RandomFunctionTest {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
int num = 0;
while(true){ //死循环,一般用break来解决,与if是好基友,一般同时用
if(num++ == Integer.MAX_VALUE){ //整型里的最大值
break;
}
}
long endTime = System.currentTimeMillis();
System.out.println("循环已结束" + num);
System.out.println("循环用时:" + (endTime - startTime) + "毫秒");
}
}
因为是num++,所以会出现溢出现象变成负数的了
2、通过Math.random()返回一个0到1之间的double值。
【Ps:这个本身产生的随机数是[0.0-1.0)之间的double类型的小数,我们可以把他乘以一定的倍数来得到想要的效果,例子如下:】
package javaDemo2;
/**
*
* 产生随机数的小测试和总结
* @author Monster丶ZF
* @version1.8
* @data 2019年4月4日
* @remakeTODO
*/
public class RandomFunctionTest {
public static void main(String[] args) {
//比如要产生一个[5-18]之间的一个随机数
int a ;
a =(int) Math.random();//首先写到这步会报错,因为Math.random()产生的是一个[0.0-1.0)之间
//double类型数字,而a定义的时候是存放整型的,所以加个强制转换
a = (int)(Math.random()*10000) ;//我们根据需要随便乘以一个较大的数字扩大一下上限和下限
a = (int)(Math.random()*10000) % 10;//%10相当于取个位数可以生成[0-9]之间的整型数字
a = (int)(Math.random()*10000) % 10 + 5; //可以生成[5-14]之间的整型数字,但我们需要的是[5-18]
a =(int)(Math.random()*10000) % 14 + 5;
//%14可以产生[0-13]的随机数在+5就可以产生[5-18]之间的随机整数
System.out.println(a);
//其实多试几个,我们就可以发现规律了
//即要产生[a-b]之间的一个整型随机数,
//则公式为:(int)(Math.random()*10000) % (b - a + 1) + a;
//其中的10000可根据需求灵活选取
}
}
其实多试几个,我们就可以发现规律了
即要产生[a-b]之间的一个整型随机数,
则公式为:(int)(Math.random()*10000) % (b - a + 1) + a;
其中的10000可根据需求灵活选取
3、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。
【Ps:我们可以通过新建一个Random的对象来产生随机数,他可以产生随机整数、float、double、long型随机数,同时import java.util.Random类有两种构建方式:带种子和不带种子。测试如下:】
package javaDemo2;
import java.util.Random;
/**
*
* 产生随机数的小测试和总结
* @author Monster丶ZF
* @version1.8
* @data 2019年4月4日
* @remakeTODO
*/
public class RandomFunctionTest {
public static void main(String[] args) {
//不带种子,这种方式将会返回随机的数字,每次运行结果都不一样
Random ran = new Random();
for (int i = 0; i < 5; i++) {
System.out.println(ran.nextDouble());
}
}
}
其中System.out.println(ran.nextDouble());也可以换成ran.nextInt();ran.nextfloat();之类的
还有一种情况是int nextInt(int n); 返回一个伪随机数,它是从此随机数生成器的序列中取出的,在包括0和指定值n(不包括)之间均匀分布的int值,如下:
package javaDemo2;
import java.util.Random;
/**
*
* 产生随机数的小测试和总结
* @author Monster丶ZF
* @version1.8
* @data 2019年4月4日
* @remakeTODO
*/
public class RandomFunctionTest {
public static void main(String[] args) {
//不带种子,这种方式将会返回随机的数字,每次运行结果都不一样
Random ran = new Random();
for (int i = 0; i < 5; i++) {
System.out.println(ran.nextInt(10));
}
}
}
运行结果:
带种子的:
public class RandomFunctionTest {
public static void main(String[] args) {
//带种子的,无论程序运行多少次,返回结果都是一样的
Random ran = new Random(10);//括号 里面的10即为种子
Random ran2 = new Random(10);
for (int i = 0; i < 5; i++) {
System.out.println(ran.nextInt());
}
System.out.println("----------------------------------------");
for (int i = 0; i < 5; i++) {
System.out.println(ran2.nextInt());
}
}
}
可以发现输出的结果,两次结果均相同,重复运行也均是同样的结果
两种方式的差别:
Random()
创建一个新的随机数生成器。
Random(long seed)
使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。
通俗说,两者的区别是:
带种子的,每次运行生成的结果都是一样的。如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。
不带种子的,每次运行生成的都是随机的,没有规律可言。
更多推荐
教你如何产生随机数!!!
发布评论