java中Random(long seed)方法与rRandom()方法的使用产生随机数
* @param seed the initial seed
* @see #setSeed(long)
*/
++++++++++++++++++带种子数的构造方法+++++++++++++
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}
}
* @since 1.2
*/
public int nextInt(int n) {
if (n <= 0)
throw new IllegalArgumentException("n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);
int bits, val;
do {
bits = next(31);
val = bits % n;
} while (bits - val + (n-1) < 0);
return val;
}
可见Random的种子要求 大于0 的 。。。
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27))
/ (double)(1L << 53);
}
+++++++++++++++nextFloat方法实现+++++++++++++
public float nextFloat() {
return next(24) / ((float)(1 << 24));
}
+++++++++++++++++nextInt方法实现:++++++++++
public int nextInt() {
return next(32);
}
* @since 1.1
*/
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));
}
一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数,下面介绍两种方法: 算法1:平方取中法。
1)将种子设为X0,并mod 10000得到4位数
2)将它平方得到一个8位数(不足8位时前面补0)
3)取中间的4位数可得到下一个4位随机数X1
4)重复1-3步,即可产生多个随机数
这个算法的一个主要缺点是最终它会退化成0,不能继续产生随机数。
1)将种子设为X0,
2)用一个算法X(n+1)=(a*X(n)+b) mod c产生X(n+1)
一般将c取得很大,可产生0到c-1之间的伪随机数
该算法的一个缺点是会出现循环。
Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。
通过阅读Math类的源代码可以发现,Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。
* @see Random#nextDouble()
*/
public static double random() {
Random rnd = randomNumberGenerator;
if (rnd == null) rnd = initRNG();
return rnd.nextDouble();
}
参考:http://www.cnblogs.com/Coffee-guy/p/3378776.html
http://blog.sina.com.cn/s/blog_4b3120470100k96z.html
最新文章
- 腾讯云下安装 nodejs + 实现 Nginx 反向代理
- shell 日期加减
- Spring 框架概述
- C代码分析器(一个 公开赛冠军)
- perl中my和our的区别分析
- shell之 printf 输出语句
- iOS开发针对对Masonry下的FPS优化讨论
- Core Java 谈谈 ThreadPoolExecutor
- Node.js JXcore 打包
- LEMP平台全编译搭建
- P1547 Out of Hay
- 1127 ZigZagging on a Tree (30 分)
- 第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索
- 20165211 预备作业3 Linux安装与学习
- FJUT 奇怪的数列(线性选择算法)题解
- Maven核心简析
- linux开启端口
- cocos2dx游戏--欢欢英雄传说--添加触摸响应
- windows 内存分配回收检查工具
- 【BZOJ 3289】 3289: Mato的文件管理 (莫队)
热门文章
- linux 项目管理、服务器管理、服务器维护
- [ios]objective-c 协议和委托 (重点基础知识)
- EasyMvc入门教程-高级控件说明(16)信息框控件
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 【转】
- VC++动态链接库(DLL)编程深入浅出(二)
- es6 - 导入导出
- VC6 在使用VC助手(Visual AssistX)在Win7下不能使用↑↓←→及回车键选择的解决的方法
- C语言八进制和十六进制数
- Build Your Hexo Blog (On Github)
- SVN客户端忽略无关文件