原文地址:http://www.yanwushu.com/post/68.html
java.util.Random所有的公共方法如下列所示,方法功能已经注释。
// 设置seed值
public void setSeed(long seed)
//next系列方法
public void nextBytes(byte[])
public int nextInt() // 产生随机int数
public int nextInt(int)//产生0到参数的随机int数
public long nextLong() // 产生随机long
public float nextFloat() // 产生随机float
public boolean nextBoolean();//产生随机boolean
public double nextDouble() // 产生随机double
public double nextGoussian()// 返回呈高斯/正态分布的 double 值,其平均值是 0.0 标准差是 1.0。
//ints、longs、doubles方法 sinces jdk 1.8
public IntStream ints();
public IntStream ints(long);
public IntStream ints(int ,int);
public IntStream ints(long,int ,int);
public LongStream longs()
public LongStream longs(long)
public LongStream longs(long , long , long)
public LongStream longs(long , long)
public DoubleStraem doubles();
public DoubleStraem doubles(long);
public DoubleStraem doubles(long , double , double);
public DoubleStraem doubles(double ,double);
计算机产生的随机数都是伪随机数(包括本文中产生的随机数),以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。
这意味着,如果2个Random对象使用相同的种子(比如都是100),并且以相同的顺序调用相同的函数,那它们返回值完全相同。比如下面代码中两个Random对象的输出完全相同
Random random1 = new Random(100);
System.out.println(random1.nextInt());
System.out.println(random1.nextFloat());
System.out.println(random1.nextBoolean());
Random random2 = new Random(100);
System.out.println(random2.nextInt());
System.out.println(random2.nextFloat());
System.out.println(random2.nextBoolean());
public static void main(String[] args) {
int max=20;
int min=10;
Random random = new Random();
int s = random.nextInt(max)%(max-min+1) + min;
System.out.println(s);
}
random.nextInt(max)表示生成[0,max]之间的随机数,然后对(max-min+1)取模。
以生成[10,20]随机数为例,首先生成0-20的随机数,然后对(20-10+1)取模得到[0-10]之间的随机数,然后加上min=10,最后生成的是10-20的随机数
当种子相同时,不同的random实例,同样顺序生成的随机数相同,那么是否会出现下面情况:
java.util.Random() a = new Random();
java.util.Random() b = new Random();
是否有运算速度极快时a和b生成的结果相同的可能性?
阿里2015实习生笔试的一道附加题:
用java代码实现:从自然数1到1000中随机取900个不重复的数,并打印出来。
以下为参考答案
package gsm;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test2 {
public static void main(String[] args) {
List list = new ArrayList();
for (int i = 1; i <= 1000; i++) {
list.add(i);
}
for (int j = 0; j < 900; j++) {
getValue(list);
}
}
//生成随机数
public static void getValue(List list) {
Random randomGenerator = new Random();
int a = randomGenerator.nextInt(list.size());
int value = list.get(a);
System.out.println(value + "");
// 这个数已经出现过了,那么从list中删除
list.remove(a);
}
}