Java 生成随机数的方法例子

前言

在实际开发中产生随机数的例子也是很普遍的,所以在程序中设计产生随机数操作很重要,这篇文章主要给大家介绍了关于Java随机数的几种获得方法,具有一定的参考价值。

一、Random 类

Random 类是从 JDK 1.0开始,它产生的随机数是伪随机数,也就是有规则的随机数。这个是专业的Random工具类,功能强大。

通过Random对象获取随机数。Random支持的随机值类型包括:boolean, byte, int, long, float, double。

创建Random对象,有两种方法:

Random random = new Random();
Random random = new Random(100);//带seed种子的构造方法

在随机数生成时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。Random 对象在种子数值相同的情况下,相同次数生成的随机数是相同的。

比如两个种子数相同的 Random 对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。默认情况下 new Random() 使用的是当前纳秒时间作为种子数的。

代码:

/**
 * 验证 Random 对象在种子数值相同的情况下,
 * 相同次数生成的随机数是相同的。
 * @param args
 */
public static void main(String[] args) {

        Random random = new Random(1);
        int anInt = 0;
        for (int i = 0;i < 3;i++) {
            anInt = random.nextInt(10);
            System.out.println(anInt);
        }
        System.out.println("--------------------------");

        Random random1 = new Random(1);
        int anInt1 = 0;
        for (int i = 0;i < 3;i++) {
            anInt1 = random1.nextInt(10);
            System.out.println(anInt1);
        }

    }

运行结果: 

Random类提供的方法:API

  • nextBoolean() – 返回均匀分布的 true 或者 false
  • nextBytes(byte[] bytes)
  • nextDouble() – 返回 0.0 到 1.0 之间的均匀分布的 double
  • nextFloat() – 返回 0.0 到 1.0 之间的均匀分布的 float
  • nextInt() – 返回均匀分布的 int
  • nextInt(int n) – 返回 0 到 n 之间的均匀分布的 int (包括 0,不包括 n)
  • nextLong() – 返回均匀分布的 long
  • setSeed(long seed) – 设置种子
  • 生成指定区间的随机数

    public static void main(String[] args) {
            
            Random random = new Random();
    
            for (int i = 0; i < 10; i++) {
                //生成1-10之间的随机数字
                int r = random.nextInt(10) + 1;
                System.out.println(r);
            }
    
            System.out.println("----------------------");
    
            for (int i = 0; i < 10; i++) {
                //生成5-15之间的随机数字
                int r = random.nextInt(11) + 5;
                System.out.println(r);
            }
        }

    可以看出, [x-n]区间的计算写法:(n-x+1)+x

    Random 使用 LGC 算法生成伪随机数的优点是执行效率比较高,生成的速度比较快。对于 Random 来说,Random 是线程安全的。从源码可以看出,Random 底层使用的是 CAS来解决线程安全问题的,因此对于绝大数随机数生成的场景,使用 Random 已经足够了。

    二、Math.random()方法

    Math.random() 产生的随机数是大于等于 0.0 且小于 1.0 的伪随机的一个double类型数值。

    当调用 Math.random() 方法时,自动创建了一个伪随机数生成器。实际上用的是 new java.util.Random()。当接下来继续调用 Math.random() 方法时,就会使用这个新的伪随机数生成器

    for (int i = 0; i < 10; i++) {
        double random = Math.random();
        System.out.println(random);
    }

    实际使用中,如果你想用它来生成一个一定范围的 int 型,可以这样写:

    生成0到9之间的随机数

    int random = (int)(Math.random() * 10);

    生成1到10之间的随机数 

    int random = (int)(Math.random()*10)+1;

     

    三、UUID

    UUID是JDK1.5中新增的一个类,在java.util包下,用它可以产生一个唯一的ID序列。

    String uuid = UUID.randomUUID().toString();
    uuid = uuid.replace("-","");

    生成的形式:ad114511-6cb3-40ec-88ba-7850d9281381

    所以我们一般会把中间的-去掉:ad1145116cb340ec88ba7850d9281381

    四、获取带字符的随机数

    如果我们想获取一个字母和数字组合的随机数,我们可以使用以下方法:

    private static final String CHARACTER_VALUE = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    
        public static void main(String[] args) {
    
            String randomStr = getRandomStr(6);
            System.out.println(randomStr);
        }
    
        //获取字母和数字组合的随机数方法
        public static String getRandomStr(int length) {
            Random random = new Random();
            StringBuffer buffer = new StringBuffer();
            String s = null;
            for (int i = 0; i < length; i++) {
                int anInt = random.nextInt(CHARACTER_VALUE.length());
                buffer.append(CHARACTER_VALUE.charAt(anInt));
            }
            return buffer.toString();
        }
    

    作者:A_aspectJ项目开发

    物联沃分享整理
    物联沃-IOTWORD物联网 » Java 生成随机数的方法例子

    发表回复