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

当前位置:首页  >  关于学院  >  技术干货  >  Java技术干货  >  正文

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

来源:千锋教育
发布时间:2023-10-10 20:54:36
分享

一、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 说道:“它在很多情况下已经很好用了,但是不能使用它来做保密使用”。

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

相关推荐

  • javaoa系统有哪些模块? 一、权限管理模块权限管理模块是Java OA系统的核心模块之一,也是整个系统的基础。该模块通过对系统用户进行身份验证、权限分配、访问控制等管理,确保了系统的安全性和稳定性。权限管理模块通常包括用户管理
  • Java中遍历数据结构Enumeration和Iterator相比有什么不同? 一、Java中遍历数据结构Enumeration和Iterator的不同1、功能和用法不同 Enumeration是Java早期版本中引入的接口,它只有两个方法:hasMoreElements()和n
  • 为什么JavaScript绝大多数内置函数都是native code? 一、JavaScript绝大多数内置函数都是native code的原因1、提高程序执行效率首先,内置函数作为引擎内部的一部分,可以提高JavaScript程序的执行效率。这是因为,内置函数的实现是直
  • C、C++、Java、JavaScript、PHP、Python、Ruby 这些语言分别主要用来开发什么? 一、C、C++、Java、JavaScript、PHP、Python、Ruby 的用途C主要用于底层模块,服务应用和嵌入式应用;C++主要用于上层服务程序,应用API,大型3D游戏;Java主要用于服
  • C++、java都将线程共享的变量等放到堆内存中,为什么选择堆这种数据结构? 一、C++、java为什么选择堆这种数据结构效率:执行堆排序所需的时间呈对数增长,而其他算法可能随着要排序的元素数量的增加而呈指数级增长。这种排序算法非常有效。内存使用: 内存使用是最小的,因为除了保
  • Java 的作用是什么? 一、Java 的作用1、跨平台Java的跨平台特性是其最大的优势之一,因为Java代码可以在各种不同操作系统和硬件平台上运行,这是因为Java程序通过Java虚拟机(JVM)来执行,JVM将Java代