首页 > 编程知识 正文

java多线程并发,java随机数组

时间:2023-05-05 12:38:14 阅读:109907 作者:2755

前言

随机数应该不太了解。 业务上用它来生成验证码,或者生成不要求再现性的id。 而且,还会在年会上抽签。 今天就讨论这个吧。 使用不当会引起一系列的问题。

java随机数

需要在Java中随机生成数字。 java开发通常使用java.util.Random进行,提供伪随机生成机制。 Jvm根据被传递的种子(seed )决定生成随机数的区间,如果种子相同,则取得的随机数序列一致。 而且生成的结果都是可以预测的。 是伪随机数的实现,而不是真正的随机数。 确保使用,但在某些用例中直接使用可能会导致意外问题。 Random的一般使用方法:

//Random实例

Random random=new Random (;

除了调用方法外,还可以使用nextint (next double )、next boolean (next float )、

random.nextInt (;

或者,也可以使用java数学计算类。

Math.random (;

Math类只包含一个生成随机数的Random实例。

公共静态双随机(public double random )

random rnd=randomnumbergenerator;

if (rnd==空值) {

//返回新的Random实例

rnd=initRNG (;

}

return rnd.nextDouble (;

}

java.util.Random的用法是线程安全的。 但是,如果在不同的线程上同时使用同一个Random实例,则可能会发生冲突并降低性能。 其理由是使用所谓的种子生成随机数。 种子是一个简单的数字,为生成新随机数提供基础。 让我们来看看Random的next(intbits )方法。

protectedintnext(intbits ) {

长整型seed,nextseed;

AtomicLong seed=this.seed;

do {

oldseed=seed.get (;

nextseed=(old seed * multiplier addend ) mask;

} while (! seed.compareandset(oldseed,nextseed );

return(int ) (Nextseed ) 48-bits ); }

首先,旧种子和新种子存储在两个辅助变量中。 在这方面,创造新物种的原则并不重要。 要保存新种子,请使用compareAndSet ()方法用以下新种子替换旧种子: 但是,只有旧种子对应于当前设置的种子时,才会触发此操作。 如果此时的值由并发线程操作,则方法返回false。 这意味着旧值与异常值不匹配。 因为是在循环内进行的操作,所以在变量与例外值一致之前会发生旋转。 这可能会降低性能,并导致线程冲突。

多线程随机数

如果更多的线程主动生成具有相同Random实例的新随机数,这种情况发生的概率就会更高。 在生成大量随机数的程序中,不推荐使用这种方法。 在这种情况下,必须使用1.7版中添加到Java中的ThreadLocalRandom。 ThreadLocalRandom扩展了Random,添加了限制对相应线程实例使用的选项。 因此,ThreadLocalRandom的实例存储在相应线程的内部映射中,并通过调用current ()返回相应的Random。 按如下方式使用:

ThreadLocalRandom.current ().nextInt ) )。

安全随机数

Random的一些分析表明,Random事实上是伪随机的,可以推导规律,并依赖种子(seed )。 如果我们在做抽奖和其他对随机数敏感的场景的时候,使用Random是不合适的,容易被抓住。 JDK为解决这个问题提供了安全随机。 SecureRandom是一个强大的随机数生成器,可以产生高强度的随机数。 产生高强度的随机数取决于两个重要因素:种子和算法。 有很多算法。 通常,如何选择种子是非常重要的因素。 因为Random的种子是System.currentTimeMillis (),所以其随机数都是可预测的,是弱伪随机数。 生成强伪随机数的思路:收集计算机的各种信息、键盘输入时间、内存使用状态、硬盘空间、IO等待时间、进程数、线程数等信息,获得接近随机的种子。 主要达到不可预测性。 更一般的说,使用加密算法生成长的随机种子,不能推测种子,也不能导出随机序列数。

总结

今天,我们讨论了业务中常用的随机数结构和几个方面的陷阱。 使用随机数的时候,希望你能避开这个陷阱。

关注微信公众号:缙农bzdhm哥获得更多晾衣架

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。