赞
踩
方法一:Math.random() 静态方法
使用:System.out.println(Math.random());
解释:返回值为 double值为正号,大于等于 0.0 ,小于 1.0 。使用经过运算可得到响应范围内的伪随机数(伪随机数是用确定 性的算法计算出来的随机序列)。
要点:第一次调用时候,创建生成器调用的initRNG()方法是synchronized,所以在多线程情况下,只有一个线程会负责创建伪随机数生成器(使用当前时间作为种子),其他线程则利用该伪随机数生成器产生随机数,因此 Math.random() 方法是线程安全的。 然而,如果许多线程需要以很高的速率产生伪随机数,则可以减少每个线程的争用以拥有自己的伪随机数发生器。
方法二:java.util.Random 工具类
使用:
Random random = new Random();
System.out.println(random.nextInt());
解释:两个构造方法
Random()
创建一个新的随机数生成器。 该构造函数将随机数生成器的种子设置为非常可能与该构造函数的任何其他调用不同的值。
Random(long seed)
使用单个long种子创建新的随机数生成器。 种子是通过方法next(int)维护的伪随机数发生器的内部状态的初始值。
常用方法:
特点:
如果两个Random()的种子一样,那么经过相同的处理,产生的伪随机数也一样。
java.util.Random是线程安全的。 但是,跨线程的同时使用java.util.Random实例可能会遇到争用,从而导致性能下降。 在多线程设计中考虑使用ThreadLocalRandom 。
java.util.Random不是加密安全的。 考虑使用SecureRandom获取一个加密安全的伪随机数生成器,供安全敏感应用程序使用。
方法三:java.util.concurrent.ThreadLocalRandom 工具类
使用: ThreadLocalRandom.current().nextX(…) (其中X是Int , Long ,等)。、
解释:ThreadLocalRandom 是 JDK 7 之后提供,也是继承至 java.util.Random。
ThreadLocalRandom用内部生成的种子进行初始化,可能不会被修改。 适用时,在并发程序中使用ThreadLocalRandom而不是共享的Random对象通常会遇到更少的开销和争用。 当多个任务(例如,每个ForkJoinTask )在线程池中并行使用随机数时,使用ThreadLocalRandom是特别合适的。
特点:用于并发产生随机数,能够解决多个线程发生的竞争争夺。
方法四: java.Security.SecureRandom
使用:
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
解释:java.Security.SecureRandom也是继承至 java.util.Random。SecureRandom 提供加密的强随机数生成器 (RNG),要求种子必须是不可预知的,产生非确定性输出。 SecureRandom 也提供了与实现无关的算法,因此,调用方(应用程序代码)会请求特定的 RNG 算法并将它传回到该算法的 SecureRandom 对象中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。