Random用法以及区别

2,435 阅读3分钟

Random的用法

Random顾名思义就是创建随机数用的,这个在抽奖等随机处理中需要用到,很典型的,在Collection.shuffling中,需要指定rnd参数,在源码中,可以看到创建rnd就是r=rnd=new Random(),这里就是创建随机数,但是随机数的创建还是有区别的。 创建随机数或者说Random用法有两种

采用Math.Random创建

倒入java.lang.Math.Random。调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。例子如下

采用Java.util.Random

下面Random()的两种构造方法:

     Random():创建一个新的随机数生成器。

     Random(long seed):使用单个 long 种子创建一个新的随机数生成器。

  我们可以在构造Random对象的时候指定种子(这里指定种子有何作用,请接着往下看),如:Random r1 = new Random(20); > 不含参构造方法每次都使用当前时间作为种子,而含参构造方法是以一个固定值作为种子    不含参的构造函数每次都使用当前时间作为种子,随机性更强 而含参的构造函数其实是伪随机,更有可预见性      或者默认当前系统时间的毫秒数作为种子数:Random r1 = new Random();

  需要说明的是:你在创建一个Random对象的时候可以给定任意一个合法的种子数,种子数只是随机算法的起源数字,和生成的随机数的区间没有任何关系。如下面的Java代码:     Random r1 = new Random(25);   int i;   i = r1.next.Int(100);      这里生成的随机数是1-100,这个25种子和区间没有直接关系,但是是有间接关系的,这个是随机算法的起源数字

随机种子

随机种子是随机算法的起源数字,对于随机算法的起源数字相同的,生成的随机数字也是相同的

        Random ran1 = new Random(10);
        System.out.println("使用种子为10的Random对象生成[0,10)内随机整数序列: ");
        for (int i = 0; i < 10; i++) {
            System.out.print(ran1.nextInt(10) + " ");
        }
        System.out.println();
        Random ran2 = new Random(10);
        System.out.println("使用另一个种子为10的Random对象生成[0,10)内随机整数序列: ");
        for (int i = 0; i < 10; i++) {
            System.out.print(ran2.nextInt(10) + " ");
        }
        /**
         * 输出结果为:
         * 
         * 使用种子为10的Random对象生成[0,10)内随机整数序列: 
         * 3 0 3 0 6 6 7 8 1 4 
         * 使用另一个种子为10的Random对象生成[0,10)内随机整数序列: 
         * 3 0 3 0 6 6 7 8 1 4 
         * 
         */
        // 在没带参数构造函数生成的Random对象的种子缺省是当前系统时间的毫秒数。
        Random r3 = new Random();
        System.out.println();
        System.out.println("使用种子缺省是当前系统时间的毫秒数的Random对象生成[0,10)内随机整数序列");
        for (int i = 0; i < 10; i++) {
            System.out.print(r3.nextInt(10)+" ");
        }
        /**
         * 输出结果为:
         * 
         * 使用种子缺省是当前系统时间的毫秒数的Random对象生成[0,10)内随机整数序列
         * 1 1 0 4 4 2 3 8 8 4
         *  
         */

案例

生成[1,2.5)区间的小数 double d3 = r.nextDouble()*1.5+1 生成生成[0,10)区间的整数
int n2 = r.nextInt(10);//方法一 n2 = Math.abs(r.nextInt() % 10);//方法二

生成n个不同的随机数,且随机数区间为[0,10)

注意,直接使用Random是无法避免生成重复数字的,需要借助array或者Collection来控制

public ArrayList getDiffNO(int n){
        // 生成 [0-n) 个不重复的随机数
        // list 用来保存这些随机数
        ArrayList list = new ArrayList();
        Random rand = new Random();
        boolean[] bool = new boolean[n];
        int num = 0;
        for (int i = 0; i < n; i++) {
            do {
                // 如果产生的数相同继续循环
                num = rand.nextInt(n);
            } while (bool[num]);
            bool[num] = true;
            list.add(num);
        }
        return list;
    }