千家信息网

java随机数的陷阱有哪些

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章将为大家详细讲解有关java随机数的陷阱有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。java中的随机数我们需要在Java中随机生成一个数字。java
千家信息网最后更新 2025年11月07日java随机数的陷阱有哪些

这篇文章将为大家详细讲解有关java随机数的陷阱有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

java中的随机数

我们需要在Java中随机生成一个数字。java开发中我们通常使用java.util.Random来搞,它提供了一种伪随机的生成机制。Jvm 通过传入的种子(seed)来确定生成随机数的区间,只要种子一样,获取的随机数的序列就是一致的。而且生成的结果都是可以预测的。是一种伪随机数的实现,而不是真正的随机数。来确定使用的但是有些用例直接使用可能会导致一些意想不到的问题。Random的一个普遍用法:

// Random 实例Random random = new Random();//调用 nextInt() 方法 此外还有nextDouble(), nextBoolean(), nextFloat(), ...random.nextInt();

或者,我们可以使用java中的数学计算类:

Math.random();

Math类只包含一个Random实例来生成随机数:

public static double random() { Random rnd = randomNumberGenerator; if (rnd == null) {  // 返回一个新的Random实例 rnd = initRNG(); } return rnd.nextDouble(); }

java.util.Random的用法是线程安全的。但是,在不同线程上并发使用相同的Random实例可能会导致争用,从而导致性能不佳。其原因是使用所谓的种子来生成随机数。种子是一个简单的数字,它为生成新的随机数提供了基础。我们来看看Random中的next(int bits)方法:

protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do {  oldseed = seed.get();  nextseed = (oldseed * multiplier addend) & mask; } while (!seed.compareAndSet(oldseed, nextseed)); return (int)(nextseed >>> (48 - bits));}

首先,旧种子和新种子存储在两个辅助变量上。在这一点上,创造新种子的原则并不重要。要保存新种子,使用compareAndSet()方法将旧种子替换为下一个新种子,但这仅仅在旧种子对应于当前设置的种子的条件下才会触发。如果此时的值由并发线程操纵,则该方法返回false,这意味着旧值与例外值不匹配。因为是循环内进行的操作,那么会发生自旋,直到变量与例外值匹配。这可能会导致性能不佳和线程竞争。

多线程下的随机数

如果更多线程主动生成具有相同Random的实例的新随机数,则上述情况发生的概率越高。对于生成许多(非常多)随机数的程序,不建议使用这种方式。在这种情况下,您应该使用ThreadLocalRandom,它在1.7版本中添加到Java中。ThreadLocalRandom扩展了Random并添加选项以限制其使用到相应的线程实例。为此,ThreadLocalRandom的实例保存在相应线程的内部映射中,并通过调用current()来返回对应的Random。使用方式如下:

ThreadLocalRandom.current().nextInt()

安全的随机数

通过对Random的一些分析我们可以知道Random事实上是伪随机,是可以推导出规律的,而且依赖种子(seed)。如果我们搞抽奖或者其他一些对随机数敏感的场景时,用Random就不合适了,容易被人钻空子。JDK提供了SecureRandom来解决这个事情。

SecureRandom是强随机数生成器,它可以产生高强度的随机数,产生高强度的随机数依赖两个重要的因素:种子和算法。算法是可以有很多的,通常如何选择种子是非常关键的因素。 Random的种子是System.currentTimeMillis(),所以它的随机数都是可预测的, 是弱伪随机数。强伪随机数的生成思路:收集计算机的各种信息,键盘输入时间,内存使用状态,硬盘空闲空间,IO延时,进程数量,线程数量等信息,CPU时钟,来得到一个近似随机的种子,主要是达到不可预测性。说的更通俗就是,使用加密算法生成很长的一个随机种子,让你无法猜测出种子,也就无法推导出随机序列数。

关于"java随机数的陷阱有哪些"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

随机数 种子 生成 线程 实例 方法 更多 算法 篇文章 陷阱 相同 重要 安全 两个 信息 变量 因素 就是 序列 强度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发 游戏开发 网络安全教育登录平台 数据库cmd怎么录入数据 第六次体育场地普查数据库 运营网络安全工程包括什么 网络服务器机房管理 软件开发后卖出的会计处理 网络安全防护方案招投标 目前流行的主流数据库有哪些 宁夏天天互联网络科技有限公司 高度重视网络安全 是 运维可以做软件开发嘛 电大数据库应用技术形考3 西城区正规软件开发技术指导 服务器维护和管理规范 网络安全工程师考证有效期 c 如何读取文件中的数据库 香港易保网络技术有限公司 网络安全教育知识宣传材料 计算机软件开发实习生工资 嘉定区上门软件开发价格表格 网络安全专项检查方案怎么写 私云通专属服务器 45岁的网络安全工程师 靖西县天气预报软件开发 宁波埠翟网络技术有限公司 java连接db2数据库 学校关于网络安全加固的汇报 数据库讨论结果 qq网页版软件开发
0