Java中生成随机数Random、ThreadLocalRandom、SecureRandom、Math.random()
2017-02-14 10:39
701 查看
我们来说说java常见的生成随机数的几种方式:Random,ThreadLocalRandom,SecureRandom;其实产生随机数有很多种方式但我们常见的就这几种,如果需要详细了解这个三个类,可以查看JAVA API.
1.先说说我们最常用的Random
Random random = new Random();
int a = random.nextInt(5);//随机生成0~4中间的数字
其实Random是有构造函数的,他的参数可以传一个long类型的值,当使用空的构造的时候,使用的实际上是system.currentTimeMillis()也就是当前时间毫秒数的值,我们把这个叫做 种子 。
种子是干什么的呢,实际上我们生成的随机数都是伪随机数,而想要使我们生成的随机数强度更高,就需要更好的
算法 和种子。一般情况下,要使用Random去生成随机数,直接用空构造函数就可以了。那么这个种子到底有什么用呢,实际上读者去试验一下就知道了,我们使用固定随机数,比如1,然后我们连续次去new这个Random,然后去生成一个随机数,像下面这样,你会发现,三个数的结果是一样的。
Random random = new Random(1);
int a = random.nextInt(5);
random = new Random(1);
int b = random.nextInt(5);
random = new Random(1);
int c = random.nextInt(5);
所以我们一定不能把这个种子写死,用当前时间毫秒数,还是比较好些。另外,使用Random尽量不要重复new对象,其实也没什么意义的。最后说一点,Random是线程 安全 的,去
这里 的官方文档可以看到,“Instances of java.util.Random are threadsafe.”。但是在 多线程 的表现中,他的性能很差。
2.再来说说不常用的一个ThreadLocalRandom
<
d205
/span>
这个类是Java7新增的类,给多线程并发生成随机数使用的。为什么ThreadLocalRandom要比Random快呢,这是因为Random在生成随机数的时候使用了CAS,但是ThreadLocalRandom却没有使用。
另外ThreadLocalRandom的实例化比较特别,下面简单举例一下。
由于是和线程绑定的,所以他也是从当前线程获取的。
3.最后在聊聊这个最不常用的,但是是最安全的SecureRandom
在需要频繁生成随机数,或者安全要求较高的时候,不要使用Random,这个很好理解吧,从我们最开始的介绍中可以知道,Random生成的值其实是可以预测的。
内置两种随机数算法,NativePRNG和SHA1PRNG,看实例化的方法了。通过new来初始化,默认来说会使用NativePRNG算法生成随机数,但是也可以配置-Djava.security参数来修改调用的算法。如果是/dev/[u]random两者之一就是NativePRNG,否则就是SHA1PRNG。
在 jvm 启动参数这样加就好了,-Djava.security=file:/dev/urandom。
当然还可以通过getInstance来初始化对象,有一个参数的,直接传一个算法名就行,如果不存在算法抛异常;另外有两个参数的,第二个参数还可以指定算法程序包。下面来看下实现代码。
当然我们使用这个类去生成随机数的时候,一样只需要生成一个实例每次去生成随机数就好了,也没必要每次都重新生成对象。另外,这个类生成随机数,首次调用性能比较差,如果条件允许最好服务启动后先调用一下nextInt()。
另外,实际上SHA1PRNG的性能将近要比NativePRNG的性能好一倍,synchronized的代码少了一半,所以没有特别重的安全需要,尽量使用SHA1PRNG算法生成随机数。
4.最后再补充一个Math.random()
这也是个比较常用的生成随机数的方式,默认生成0~1之间的小数.
1.先说说我们最常用的Random
Random random = new Random();
int a = random.nextInt(5);//随机生成0~4中间的数字
其实Random是有构造函数的,他的参数可以传一个long类型的值,当使用空的构造的时候,使用的实际上是system.currentTimeMillis()也就是当前时间毫秒数的值,我们把这个叫做 种子 。
种子是干什么的呢,实际上我们生成的随机数都是伪随机数,而想要使我们生成的随机数强度更高,就需要更好的
算法 和种子。一般情况下,要使用Random去生成随机数,直接用空构造函数就可以了。那么这个种子到底有什么用呢,实际上读者去试验一下就知道了,我们使用固定随机数,比如1,然后我们连续次去new这个Random,然后去生成一个随机数,像下面这样,你会发现,三个数的结果是一样的。
Random random = new Random(1);
int a = random.nextInt(5);
random = new Random(1);
int b = random.nextInt(5);
random = new Random(1);
int c = random.nextInt(5);
所以我们一定不能把这个种子写死,用当前时间毫秒数,还是比较好些。另外,使用Random尽量不要重复new对象,其实也没什么意义的。最后说一点,Random是线程 安全 的,去
这里 的官方文档可以看到,“Instances of java.util.Random are threadsafe.”。但是在 多线程 的表现中,他的性能很差。
2.再来说说不常用的一个ThreadLocalRandom
<
d205
/span>
这个类是Java7新增的类,给多线程并发生成随机数使用的。为什么ThreadLocalRandom要比Random快呢,这是因为Random在生成随机数的时候使用了CAS,但是ThreadLocalRandom却没有使用。
另外ThreadLocalRandom的实例化比较特别,下面简单举例一下。
ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current(); int a =threadLocalRandom.nextInt(5);
由于是和线程绑定的,所以他也是从当前线程获取的。
3.最后在聊聊这个最不常用的,但是是最安全的SecureRandom
在需要频繁生成随机数,或者安全要求较高的时候,不要使用Random,这个很好理解吧,从我们最开始的介绍中可以知道,Random生成的值其实是可以预测的。
内置两种随机数算法,NativePRNG和SHA1PRNG,看实例化的方法了。通过new来初始化,默认来说会使用NativePRNG算法生成随机数,但是也可以配置-Djava.security参数来修改调用的算法。如果是/dev/[u]random两者之一就是NativePRNG,否则就是SHA1PRNG。
在 jvm 启动参数这样加就好了,-Djava.security=file:/dev/urandom。
当然还可以通过getInstance来初始化对象,有一个参数的,直接传一个算法名就行,如果不存在算法抛异常;另外有两个参数的,第二个参数还可以指定算法程序包。下面来看下实现代码。
SecureRandom secureRandom = new SecureRandom(); SecureRandom secureRandom3 = SecureRandom.getInstance("SHA1PRNG"); SecureRandom secureRandom2 = SecureRandom.getInstance("SHA1PRNG", "SUN");
当然我们使用这个类去生成随机数的时候,一样只需要生成一个实例每次去生成随机数就好了,也没必要每次都重新生成对象。另外,这个类生成随机数,首次调用性能比较差,如果条件允许最好服务启动后先调用一下nextInt()。
另外,实际上SHA1PRNG的性能将近要比NativePRNG的性能好一倍,synchronized的代码少了一半,所以没有特别重的安全需要,尽量使用SHA1PRNG算法生成随机数。
4.最后再补充一个Math.random()
这也是个比较常用的生成随机数的方式,默认生成0~1之间的小数.
相关文章推荐
- Java中生成随机数Random、ThreadLocalRandom、SecureRandom、Math.random()
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
- [疯狂Java]基础类库:Random(随机数生成)、ThreadLocalRandom(线程安全随机数生成)
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
- [转]Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom(转)
- [转]Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
- JAVA随机数生成 | Math.random()方法 | 随机生成int、double类型
- Java 基础 分别使用Math和Random生成随机数
- java中Random与Math.random用法 生成int随机数
- java中随机数Random和ThreadLocalRandom()用法与区别
- 为什么要使用ThreadLocalRandom代替Random生成随机数
- 生成随机数的类Random和ThreadLocalRandom
- 生成随机数的类Random和ThreadLocalRandom
- JAVA中利用Math.random生成随机数
- java常用类解析十一:Random类(Math.random())生成指定范围的随机数或字符
- java常用类解析十一:Random类(Math.random())生成指定范围的随机数或字符
- java 使用Random和Math.random()去生成10以内的随机数