千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:南昌千锋IT培训  >  技术干货  >  Javascript里Math.random()产生的随机数的规律是什么?

Javascript里Math.random()产生的随机数的规律是什么?

来源:千锋教育
发布人:xqq
时间: 2023-10-14 00:59:32

一、Javascript里Math.random()产生的随机数的规律

伪随机数在范围从0 到小于1,也就是说,从 0(包括 0)往上,但是不包括 1(排除 1),然后您可以缩放到所需的范围。实现将初始种子选择到随机数生成算法;它不能被用户选择或重置。

请注意,由于 JavaScript 中的数字是 IEEE 754 浮点数字,具有最近舍入(round-to-nearest-even)的行为,因此以下函数的范围 (不包括Math.random() 本身) 并不准确。如果选择了非常大的边界 (2^53 或更高), 在极罕见的情况下会计算通常 – 排除(usually-excluded)的上界。(注:round-to-nearest-even 采用最近舍入的去偶数舍入的方式,对.5 的舍入上,采用取偶数的方式)

得到一个大于等于 0,小于 1 之间的随机数

function getRandom() {

  return Math.random();

}

Copy to Clipboard

得到一个两数之间的随机数

这个例子返回了一个在指定值之间的随机数。这个值不小于 min(有可能等于),并且小于(不等于)max。

function getRandomArbitrary(min, max) {

  return Math.random() * (max – min) + min;

}

Copy to Clipboard

得到一个两数之间的随机整数

这个例子返回了一个在指定值之间的随机整数。这个值不小于 min (如果 min 不是整数,则不小于 min 的向上取整数),且小于(不等于)max。

function getRandomInt(min, max) {

  min = Math.ceil(min);

  max = Math.floor(max);

  return Math.floor(Math.random() * (max – min)) + min; //不含最大值,含最小值

}

延伸阅读:

二、伪随机数生成器(PRNG)

伪随机数生成器是由冯诺依曼在 1946 年创造的。他的基本思想是从一个随机数种子开始,对其平方,然后取中间值。接下来重复对得到的数取平方并取中间值的过程,就会得到一个具有统计意义属性的随机数序列了。这也就是广为人知的平方取中法。

然而,冯诺依曼的方法并没有经得住时间的考验,因为不论从什么随机种子开始,序列最终都会落入某个短循环序列,比如:8100,6100,4100,8100,6100,4100……。

序列中的数字是依赖于前一个数字的这种生成函数,上面的重复循环问题是不可避免的。但是如果说这个循环间隔非常非常大,对实际应用并不会产生影响,那会怎样呢?

1949 年,数学家 D.H.Lehmer 利用线性同余生成器(LCG)实现了这一思路。下面给出的是基于 Lehmer 的方法所实现的一种朴素 PRNG,叫做中央随机数生成器,使用 JavaScript 在 1995 年写的。

    // The Central Randomizer 1.3 (C) 1997 by Paul Houle (paul@honeylocust.com)

    // See:  http://www.honeylocust.com/javascript/randomizer.html

    rnd.today=new Date();

    rnd.seed=rnd.today.getTime();

    function rnd() {

      rnd.seed = (rnd.seed*9301+49297) % 233280;

      return rnd.seed/(233280.0);

    };

    function rand(number) {

      return Math.ceil(rnd()*number);

    };

注意代码中的魔法数字(如 9301 等),这些数字(通常是质数)是用来最大化重复区间的——上面所提到的自我重复的循环区间。这种 PRNG 使用当前时间作为种子值,重复区间可以达到 2 的 31 次方。

这种中央随机生成器发明之初非常流行,因为那时的 JavaScript 1.0 还没有内置 Math.random() 函数,当时的 Web 1.0 环境下,大家都想让自己的 banner 广告随机旋转。一个开发者 Paul Houle 说道:“它在很多情况下已经很好用了,但是不能使用它来做保密使用”。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

为什么采用线性探测法散列算法?

2023-10-14

为什么Redis一定要用跳表来实现有序集合?

2023-10-14

markdown用什么软件?

2023-10-14

最新文章NEW

为什么将stack译作堆栈而不是栈?

2023-10-14

什么是单支树?

2023-10-14

为什么python没有大顶堆?

2023-10-14

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>