在Java中获取随机数很简单,在Java 1版本中就已经有这个实现了就是Random类。
关于Random类,Java doc是这样解释的:
An instance of this class is used to generate a stream of
pseudorandom numbers. The class uses a 48-bit seed, which is
modified using a linear congruential formula. (See Donald Knuth,
The Art of Computer Programming, Volume 2, Section 3.2.1.)
该类的一个实例用于生成伪随机数。该类使用一个48位种子,即用线性同余公式修正的。(见Donald KnuthThe Art of Computer Programming, Volume 2, Section 3.2.1.]
具体实现算法请参见:线性同余算法。
Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。
下面介绍一下Random类的使用,以及如何生成指定区间的随机数组以及实现程序中要求的几率。
1、Random对象的生成
Random类包含两个构造方法,下面依次进行介绍:
a、public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
b、public Random(long seed)
该构造方法可以通过制定一个种子数进行创建。
那如何使用Random来产生100个随机数呢?
最简单的方式:
public static void main(String[] args) {
Random rm = new Random();
for(int i=0;i<100;i++)
{
System.out.println(rm.nextInt(100)+1);
}
}
这种方式很清晰明了,但是实际运行就会发现这种方式生成的随机数是有重复的,显然不符合场景
根据Set结构的特性(Set 集合是无序不可以重复的的),来看看改进之后的实现方式:
public static void main(String[] args) {
Set hashSet = new HashSet();
Random rm = new Random(1);
int totalCount = 1;
Long begin = System.currentTimeMillis();
while (hashSet.size() != 100) {
totalCount++;
hashSet.add(rm.nextInt(100) + 1);
}
Iterator it = hashSet.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Long end = System.currentTimeMillis();
System.out.println("花费的总时间" + (end - begin));
}
上面这种方式虽然是最快的实现方式,但HashSet迭代的时候,打印出来的元素和插入元素顺序是不一致的,这与元素的HashCode大小有关。
我们可以用LinkedHashSet来解决遍历和插入的时候元素不一致的情况,如下:
public static void main(String[] args) {
Set hashSet = new LinkedHashSet();
Random rm = new Random(1);
int totalCount = 1;
Long begin = System.currentTimeMillis();
while (hashSet.size() != 100) {
totalCount++;
hashSet.add(rm.nextInt(100) + 1);
}
Iterator it = hashSet.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Long end = System.currentTimeMillis();
System.out.println("花费的总时间" + (end - begin));
}
当然我们也可以用ArrayList来实现,如下:
public static void main(String[] args) {
List integers=new ArrayList<>();
Random rm = new Random();
int tempvalue = rm. nextInt(100)+1;
int totalCount =1;
Long begin= System.currentTimeMillis();
while (integers.size() != 100) {
totalCount++;
if (integers.contains(tempvalue)) {
tempvalue = rm.nextInt(100)+1;
} else {
integers.add(tempvalue);
System.out.println(tempvalue);
}
}
System.out.println("while循环次数:"+totalCount);
Iterator it = integers.iterator();
int count = 0;
while(it.hasNext()){
System.out.println("第"+ ++count +"个随机数 =="+it.next());
}
Long end= System.currentTimeMillis();
System.out.println("花费的总时间"+(end - begin));
}