对JAVA程序员来说,我们都知道java.lang.Math类中有一个random的静态方法来生成随机数。这个方法生成一个double的随即数,这个数的范围在(0.0,1.0)之间,通过乘上某个数来完成0至某个数之间的随机数。
可是对于随即数如何产生的,到底这个数是不是真的随即你知道多少呢?
一、随机数的产生
我们拿源码说话
public static double random() { if (randomNumberGenerator == null) initRNG(); return randomNumberGenerator.nextDouble(); }
这里需要一个随即数的生成器
private static synchronized void initRNG() { if (randomNumberGenerator == null) randomNumberGenerator = new Random(); }
其实随机数生成器只是一个叫Random()类
private final AtomicLong seed; private final static long multiplier = 0x5DEECE66DL; private final static long mask = (1L << 48) - 1; private static volatile long seedUniquifier = 8682522807148012L; public Random() { this(++seedUniquifier + System.nanoTime()); } public Random(long seed) { this.seed = new AtomicLong(0L); setSeed(seed); } synchronized public void setSeed(long seed) { seed = (seed ^ multiplier) & mask; this.seed.set(seed); haveNextNextGaussian = false; }
这就是几乎所有相关源码了
经过这一些计算之后就能得到所谓的随即数了。二、为什么随机数随即至于为什么计算之后就是随即数了,我也一直抱有怀疑的看法。我看源码注释上看到了如下说明
An instance of this class is used to generate a stream of pseudorandom numbers.
意思说这个是生成一个伪随机数的类。
三、随机数和伪随机数? 维基百科上如下说明
产生随机数有多种不同的方法。这些方法被称为随机数发生器。随机数最重要的特性是它在产生时后面 的那个数与前面的那个数毫无关系。 真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。 这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。 在实际应用中往往使用伪随机数就足够了。这些数列是“似乎”随机的数,实际上它们是通过一个 固定的、可以重复的计算方法产生的。它们不真正地随机,因为它们实际上是可以计算出来的, 但是它们具有类似于随机数的统计特征。这样的发生器叫做伪随机数发生器。
相关推荐
Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。 for (int i = 0; i < 5; i++) { ...
math.random函数的一些用法技巧
//产生随机数的类 final SuiJiShuClass sjs=new SuiJiShuClass(); final JPanel panel=new JPanel(); //初始化一个JPanel ...int m=(int)Math.rint(Math.random()*(parseInt2-parseInt3)+ parseInt3);
Math.random():获取0~1随机数 Math.floor() method rounds a number DOWNWARDS to the nearest integer, and returns the result. (小于等于 x,且与 x 最接近的整数。)其实返回值就是该数的整数位:Math.floor(0....
猜数字Math.random 利用alert函数 猜数字Math.random 利用alert函数 猜数字Math.random 利用alert函数 猜数字Math.random 利用alert函数
random函数参数 无参数 random函数返回值 返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) random函数示例 [removed](Math.random()); 返回随机数 [removed](Math.random()*(20-10)+10); 返回10-20的随机数 ...
下面小编就为大家带来一篇浅谈java中Math.random()与java.util.random()的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文为大家介绍下Javascript中的四舍五入Math.round()与Math.pow()的使用,感兴趣的朋友不要错过
Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) 生成n-m,包含n但不包含m的整数: 第一步算出 m-n的值,假设等于w 第二步Math.random()*w 第三步Math.random()*w+n 第四步parseInt(Math....
Math.random()方法返回大于等于 0 小于 1 的一个随机数。对于某些站点来说,这个方法非常实用,因为可以利用它来随机显示一些名人名言和新闻事件。 1. 在连续整数中取得一个随机数 值 = Math.floor(Math.random() *...
纯JS摇号器,使用JS Math.random()获取随机值,Math.ceil()取值,可设置随机操作数,摇号速率。实用,简单,方便。
今天小编就为大家分享一篇关于实例讲解Java中random.nextInt()与Math.random()的基础用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
lotus domino AJAX URL调用代理Math.random()
今天小编就为大家分享一篇关于JavaScript使用Math.random()生成简单的验证码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Math.uuid.js js 生成 uuid
Math.random() ; 下面是参数的详细信息: NA 返回值: 返回0(含)和1(不包括)之间的随机数 例子: <html> <head> <title>JavaScript Math random() Method</title> </head> <...
* math.js * https://github.com/josdejong/mathjs * * Math.js is an extensive math library for JavaScript and Node.js, * It features real and complex numbers, units, matrices, a large set of * ...
通过阅读Math.random()的源码,或者干脆利用IDE的自动完成功能,开发人员可以很容易发现,java.lang.Math.random()使用一个内部的随机生成对象 - 一个很强大的对象可以灵活的随机产生:布尔值、所有数字类型,甚至是...