java随机数怎么生成,java随机数生成的4种方法
在 Java 中,生成随机数的场景有很多,所以本文我们就来盘点一下 4 种生成随机数的方式,以及它们之间的区别和每种生成方式所对应的场景。
Random
Random 类诞生于 JDK 1.0,它产生的随机数是伪随机数,也就是有规则的随机数。Random 使用的随机算法为 linear congruential pseudorandom number generator (LGC) 线性同余法伪随机数。在随机数生成时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
Random 对象在种子数相同的情况下,相同次数生成的随机数是相同的。比如两个种子数相同的 Random 对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。默认情况下 new Random() 使用的是当前纳秒时间作为种子数的。
① 基础使用
使用 Random 生成一个从 0 到 10 的随机数(不包含 10),实现代码如下:
// 生成 Random 对象Random random = new Random();for (int i = 0; i < 10; i++) { // 生成 0-9 随机整数 int number = random.nextInt(10); System.out.println("生成随机数:" + number);}
以上程序的执行结果为:
② 优缺点分析
Random 使用 LGC 算法生成伪随机数的优点是执行效率比较高,生成的速度比较快。
它的缺点是如果 Random 的随机种子一样的话,每次生成的随机数都是可预测的(都是一样的)。如下代码所示,当我们给两个线程设置相同的种子数的时候,会发现每次产生的随机数也是相同的:
// 创建两个线程for (int i = 0; i < 2; i++) { new Thread(() -> { // 创建 Random 对象,设置相同的种子 Random random = new Random(1024); // 生成 3 次随机数 for (int j = 0; j < 3; j++) { // 生成随机数 int number = random.nextInt(); // 打印生成的随机数 System.out.println(Thread.currentThread().getName() + ":" + number); // 休眠 200 ms try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("---------------------"); } }).start();}
以上程序的执行结果为:
③ 线程安全问题
当我们要使用一个类时,我们首先关心的第一个问题是:它是否为线程安全?对于 Random 来说,Random 是线程安全的。
PS:线程安全指的是在多线程的场景下,程序的执行结果和预期的结果一致,就叫线程安全的,否则则为非线程安全的(也叫线程安全问题)。比如有两个线程,第一个线程执行 10 万次 ++ 操作,第二个线程执行 10 万次 -- 操作,那么最终的结果应该是没加也没减,如果程序最终的结果和预期不符,则为非线程安全的。
本文地址:百科问答频道 https://www.neebe.cn/wenda/903352.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!