java中的随机数,java.lang.Math.random()和java.util.Random.nextDouble()
Math.random()方法是生成0.0---1.0区域内的随机数,每次返回的数值都是不一样,应该可以算作随机数,
而Random类,如果初始化时候new Random(12).nextDouble()是这样设置的int seed 这个值一直是12,那么,不论循环多少次,多长时间间隔,
生成的第一个随机数即第一次调用nextDouble()方法返回的结果都是一样的。这个是因为,这个生成的随机数是通过 12这个seed为参数,调用特定算法生成了,所以不论怎样,生成的数值都是一样,这个算伪随机数
Math.random()方法内部其实也是调用的Random类的nextDouble()方法。只不过其调用的是无参的构造方法
/** * Creates a new random number generator. This constructor sets * the seed of the random number generator to a value very likely * to be distinct from any other invocation of this constructor. */ public Random() { this(seedUniquifier() ^ System.nanoTime()); }
这个方法会调用时间戳还有原子seeduniquifier()方法进行seed参数的初始化,所以Math.random()方法每次生成的数据都是不一样的
根据网上说法:发现java中的随机方法是相对意义上的真随机数,也就是伪随机数。
Random类构造方法带固定参数,
黑客可以通过生成的随机序列反推出这个随机种子,也就是seed参数的值,从而预测出下一个产生的随机序列数
如下面,生成1到100的随机数,并统计1到100随机出现的次数。
public class RandomTest { static Random random = new Random(10); public static void main(String[] args) { int[] count = new int[100]; for (int i = 0; i < 100000; i++) { //System.out.println(Math.random() * 10 + "工具类:" + random.nextInt(5)); int number = random.nextInt(100) + 1; //System.out.println("生成随机数为:"+number); count[number - 1]++; } for (int i = 0; i < 100; i++) { System.out.println("数字" + i + 1 + ":" + count[i]); } } }
重复执行多次各个数据出现的次数都是一样了。下面是返回的结果,两次返回的结果是一样的
数字86:992 数字87:996 数字88:998 数字89:1037 数字90:899 数字91:987 数字92:988 数字93:978 数字94:981 数字95:1001 数字96:985 数字97:1019 数字98:1018 数字99:930 数字100:962
所以使用随机数的时候最好默认使用空的构造方法,就可以防止数据出现次数相同
new Random();