Java中的随机数生成的方法

你们经常使用随机数干什么?比如生成随机数的图形验证码啥的,我经常使用的就是生成随机数。


一、经常使用的方式:java.util.Random

用起来很简单,只要引入java.util.Random包就行了:

其实在大多数情况下大家基本都用的MD5加盐的那种形式,完全就够用。

java 复制代码
import java.util.Random;

public class BasicRandomDemo {
    public static void main(String[] args) {
        // 创建随机数生成器对象
        Random rand = new Random(); 

        // 生成一个0到99之间的随机整数
        int randomNum = rand.nextInt(100); 
        System.out.println("0-99的随机整数: " + randomNum);

        // 生成一个随机的true或false
        boolean randomBool = rand.nextBoolean(); 
        System.out.println("随机布尔值: " + randomBool);

        // 生成一个0.0(包含)到1.0(不包含)之间的随机小数
        double randomDouble = rand.nextDouble(); 
        System.out.println("0-1之间的随机小数: " + randomDouble);
    }
}

关键点:

  1. 它是"伪随机":看着随机,其实背后是数学公式算出来的。只要种子一样,序列就一样,千万不要用这种方式生成密码这类比较保密的东西,
  2. 线程安全但有代价 :Random本身是线程安全的,多个线程可以一起用。但代价是并发性能差(内部用了锁),如果很多线程同时疯狂调用,可能会卡。

二、java.util.concurrent.ThreadLocalRandom

如果你的程序是多线程的(比如Web服务器、并行计算),而且每个线程都需要疯狂生成随机数,这时候再用基础的Random就容易堵车。那么这个时候就要使用ThreadLocalRandom

java 复制代码
import java.util.concurrent.ThreadLocalRandom;

public class ConcurrentRandomDemo {
    public static void main(String[] args) {
        // 模拟10个线程并行生成随机数
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                // 每个线程获取自己的ThreadLocalRandom实例
                ThreadLocalRandom tlr = ThreadLocalRandom.current(); 

                // 生成该线程自己的随机整数 (比如1-100)
                int threadRand = tlr.nextInt(1, 101); 
                System.out.println(Thread.currentThread().getName() + ": " + threadRand);
            }).start();
        }
    }
}
  1. 线程隔离 :每个线程都有自己的ThreadLocalRandom实例(藏在ThreadLocal里),
  2. 用法更友好 :生成范围随机数(比如1到100)直接用nextInt(origin, bound),比Random的nextInt(bound)再自己加偏移量方便多了。

三、还有一种就是java.security.SecureRandom

前面两个都是"伪随机",看着随机,其实有迹可循。如果你搞的是:

  • 用户密码的盐(Salt)
  • 加密密钥
  • 会话令牌(Session Token)

那就必须使用------SecureRandom 代码中引入java.security.SecureRandom

java 复制代码
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class SecureRandomDemo {
        public static void main(String[] args) {
            // 创建一个SecureRandom实例,明确指定算法(推荐)
            // 常见算法有 "SHA1PRNG", "NativePRNG", "Windows-PRNG"等
            SecureRandom secRand = new SecureRandom(); // 获取平台推荐的强安全实现

            // 生成一个安全的随机字节数组(比如用作密码的盐)
            byte[] salt = new byte[16]; // 16字节 = 128位,常用作盐的长度
            secRand.nextBytes(salt);
            System.out.println("安全的随机盐 (Hex): " + bytesToHex(salt));

            // 生成一个安全的随机整数 (范围0-99999)
            int secureNum = secRand.nextInt(100000);
            System.out.println("安全随机整数 (0-99999): " + secureNum);

        }
        private static String bytesToHex(byte[] bytes) {
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        }
}

执行效果(到目前为止,在实际项目中我还没使用过这种):

相关推荐
马良神笔39 分钟前
2026 年Rag最近技术前沿总结
后端·python·django
程序猿DD39 分钟前
同样10美元,OpenDesign和Command Code的DeepSeek V4.1 Flash额度到底有多少?
后端
高频因子挖掘机1 小时前
A股量化从日线升级到5分钟线:数据量增加后最先暴露哪些工程问题?
后端·github·api
高频因子挖掘机2 小时前
历史行情返回顺序变了,为什么按行号计算指标很危险?
后端·github·api
团子哒哒3 小时前
数组、切片和Map
后端
专注仿真3 小时前
ThinkPHP6 API接口开发实例:从零搭建RESTful风格接口
后端·php·restful
开心猴爷3 小时前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios
1m555555553 小时前
RAG 工程实战(五):正确知识已经进入 Prompt,为什么大模型还是会答错?
后端·面试
易小尊3 小时前
我的模型在 65% 以上时准得可怕,在 50% 时像在掷硬币
后端
用户2788607285673 小时前
fallback 会盖掉平台提示词:system、空数组和 systemAppend 的差别
前端·后端