zoukankan      html  css  js  c++  java
  • 关于Random类产生随机数的一些问题

    package test2;
    
    import java.util.Random;
    
    /**
     * @author cy 
     *
     * @date 2015年7月28日 上午8:47:52
     *
     * @Description TODO
     */
    
    public class Enums {
        private static Random rand = new Random() ; // 为什么一直是47
        public static <T extends Enum<T>> T random(Class<T> ec ){
            return random(ec.getEnumConstants()) ;
        }
        public static <T> T random(T[] values ){
            int x = rand.nextInt(values.length) ;
            System.out.println("x: " + x);
            return values[x] ;
        }
        public static void main(String[] args) {
            for( int i = 0 ; i < 10 ; i ++){
                System.out.println(rand.nextInt(3));
            }
            System.out.println("=============");
            for( int i = 0 ; i < 11 ; i ++){
                System.out.println(rand.nextInt(3));
            }
        }
    }

    上面的这个程序的输出序列不会发生变化。

    下面的这个程序输出也不会发生变化。但是我本来是想达到每次运行都不同,达到随机的效果。

    package test2;
    
    /**
     * @author cy
     *
     * @date 2015年7月28日 上午9:34:32
     *
     * @Description TODO
     */
    public enum SecurityCategory {
        STOCK(Security.Stock.class), BOND(Security.Bond.class);
        public Security[] values;
    
        private SecurityCategory(Class<? extends Security> security) {
            values = security.getEnumConstants();
        }
    
        interface Security {
            enum Stock implements Security {
                SHORT, LONG, MARGIN
            }
    
            enum Bond implements Security {
                MUNICIPAL, JUNK
            }
        }
    
        public Security randomSelect() {
            return Enums.random(values);
        }
    
        public static void main(String[] args) {
            /**
             * 这个程序的输出不会出现随机出现的效果,
             * 原因: 一个java程序运行就会打开一个java虚拟机
             * (可以观察在系统进程中会有多个javaw.exe的进程
             * ,因为打开一个eclipse会有多个功能模块依靠java虚拟机运行,JVM只有一个,但有多个虚拟机实例 ),
             * 当程序关闭了相应的虚拟机实例也就关闭了。在该程序中有两点需要注意,1. 带有固定种子数的Random产生的随机数是
             * 一个固定序列。2. 每当运行程序时,静态的Random对象就会重新初始化,所以产出的随机序列就一直不变。
             * 所以会出现这样的运行结果: 
             * 在Enums.java中运行main方法输出的结果一直是不变的。而且在这个程序中的输出也一直是不变的。
             * 如果在Random对象中不填种子数,API中是这样写的
             * “创建一个新的随机数生成器。此构造方法将随机数生成器的种子设置为某个值,该值与此构造方法的所有其他调用所用的值完全不同”
             * 虽然我没有明白这是啥意思,估计是说产生独一无二的的种子数。
             * 
             */
            for (SecurityCategory s : SecurityCategory.values()) {
                /*
                 * for(Security c : s.values){ System.out.println(c); }
                 */
                System.out.println(s.randomSelect());
                System.out.println("============");
            }
    
        }
    }

    原因写在注释中了~~~~~~~~~~

  • 相关阅读:
    二叉树的遍历
    深度优先遍历和广度优先遍历
    N的阶乘末尾有多少个0
    框架产生的历史
    Ansible--初始ansible
    日积跬步05
    日积跬步04
    日积跬步03
    日积跬步02
    日积跬步01
  • 原文地址:https://www.cnblogs.com/caiyao/p/4684597.html
Copyright © 2011-2022 走看看