Chrome V8引擎系列随笔 (1):Math.Random()函数概览
先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 。从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分布更加的密集,也就是说Math.Random()函数能表示的数字更多了,大家在.NET中肯定也用过GUID吧,至于GUID为什么会永不重复,大家有没有想过呢?

还是让我们先来看看官方怎么解释Math.Random()吧,它是返回了一个正数,这个正数介于0~1之间,以伪随机的方式在这个范围内波动。Math.Random()函数在JS中也被大量的使用到。它的核心原理是用到了(伪随机数生成器PRNG),随机数从一个内部状态派生而来,通过一个固定的算法来得到每次不同的随机数。所以对于一个已知的内部初始状态,随机数的队列是可以计算出来的;自从位大小N被限制以来,PRNG生成器会重复它自己之前的工作。置换图的周期上界最大范围为2n 。
下面带大家看看PRNG(伪随机数)生成算法。伪随机数,为什么说不是 真正的随机数呢?因为随机数是永不重复的!伪随机数只是“一群隔得很近的数”,用我们数学当中的讲法就是,趋近于某个数,但是不等于某个数,也就是它的“极限”等于某个数,大学数学里面有说到。下面是数学解释:
- 概率分布在
上 (当
在柏来尔域上)。
- 非空柏来尔域
,比如
,左边的式子意思是,t<=0,t是实数;如果
没有定义,那就可能是
或者
被附加在上下文当中。
非空集合(不一定在柏来尔域中),
是一个集合,它是介于
和它内部本身之间的。假设P是均匀分布在(0,]之间,那么A也有可能是在(0,1]之间的,如果A没有被定义,那么它就会假定包含在P的支持里并包含在它的内部,且依赖于上下文环境。- 我们称一个函数:
(当
为正数集合,对于
来说伪随机数生成器,对于给定的
来说当且仅当在A中)


以上的介绍是不是晕掉了呢?没关系,上面的只是让你对Random算法有个大概的了解,并不要求你完全理解(其实我也不太理解)。其实事实上,关于PRNG算法有很多的实现方式,最有名的就当 Mersenne-Twister和LCG了。每种不同的算法都有它自己的特点,有点甚至是缺点。想当然的说:其实只需要用很少的时间,就可以完成整个流程的计算,以及长周期计算。当性能,内存使用情况,计算周期都能被很容易的被估计到和计算到时,Random分布的质量将会更难被决定,测试的难度也会更大。
下面的代码就是把2个16位的state(状态码)融合在一起。32位的数字转换成浮点型,并以介于0~1的形式呈现给我们。
uint32_t state0 = 1;
uint32_t state1 = 2;
uint32_t mwc1616() {
state0 = 18030 * (state0 & 0xffff) + (state0 >> 16);
state1 = 30903 * (state1 & 0xffff) + (state1 >> 16);
return state0 << 16 + (state1 & 0xffff);
MWC1616 算法用到了少量的内存,以及快速的运行速度,但是它的品质(quality)却是不敢让人恭维的,它的特性有如下几点:
- 数字的范围能从232提升到252次方并让它只介于0~1之间。
- 更重要的state1依赖于state0的值(见上面的代码)。
- 数字的最大跨度可以达到 232 但是如果选择了一个不好的初始状态,周期长度会缩短到4千万以下。
因为64位的会出很多问题(GOOGLE研究员说的),GOOGLE采用了一种新的xorshift128+算法,看名字大家也知道了,是128位的,周期是 2128 - 1.
uint64_t state0 = 1;
uint64_t state1 = 2;
uint64_t xorshift128plus() {
uint64_t s1 = state0;
uint64_t s0 = state1;
state0 = s0;
s1 ^= s1 << 23;
s1 ^= s1 >> 17;
s1 ^= s0;
s1 ^= s0 >> 26;
state1 = s1;
return state0 + state1;
}
其实通过这篇文章,大家只能对这个函数有个大概的了解,但是我可以让大家明白一点,看过这篇文章后,您还会怀念IE6吗?O(∩_∩)O哈哈~
Chrome V8引擎系列随笔 (1):Math.Random()函数概览的更多相关文章
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- Chrome V8 引擎源码剖析
Chrome V8 引擎源码剖析 V8 https://github.com/v8/v8 array & sort https://github.com/v8/v8/search?l=Java ...
- 浅谈Chrome V8引擎中的垃圾回收机制
垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...
- Node.js和Chrome V8 引擎了解
说起Node就不得不先介绍一个Chrome V8 引擎. 随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScr ...
- Math.random();函数 随机数
random函数参数 无参数 random函数返回值 返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) random函数示例 document.write(Math.random()); ...
- Chrome V8引擎的一点认识
最近在玩弄JavaScript ,也一直在捉摸,脚本Engine怎么解析你写的Code,对Google兴趣浓,索性就看了谷歌的脚本engine的官方资料,都是E文的,但是却是最纯的不是,看下来总结V8 ...
- V8引擎——详解
前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力.编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进 ...
- v8引擎详解
引用网址: https://blog.csdn.net/swimming_in_it_/article/details/78869549 前言 JavaScript绝对是最火的编程语言之一,一直具有很 ...
- 使用js Math.random()函数生成n到m间的随机数字
何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备,Math.random()函数返回0和1之间的伪随机数 摘要: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后 ...
随机推荐
- vue2.0实践的一些细节
最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...
- 结合Jexus + Kestrel 部署 asp.net core 生产环境
ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...
- HTML BOM Browser对象
BOM:Browser Object Model,即浏览器对象模型,提供了独立于内容的.可以与浏览器窗口进行互动的对象结构. Browser对象:指BOM提供的多个对象,包括:Window.Navig ...
- 关于python的bottle框架跨域请求报错问题的处理
在用python的bottle框架开发时,前端使用ajax跨域访问时,js代码老是进入不了success,而是进入了error,而返回的状态却是200.url直接在浏览器访问也是正常的,浏览器按F12 ...
- 【JS基础】对象
delete 可以删除对象属性及变量 function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);// ...
- BPM配置故事之案例9-根据表单数据调整审批线路2
老李:好久不见啊,小明. 小明:-- 老李:不少部门有物资着急使用,现在的审批流程太慢了,申请时增加一个是否加急的选项吧.如果选加急,金额1000以下的直接到我这里,我审批完就通过,超过1000的直接 ...
- NSURLSession详解
导语 现在NSURLConnection在开发中会使用的越来越少,iOS9已经将NSURLConnection废弃,现在最低版本一般适配iOS7,所以也可以使用. NSURLConnection相对于 ...
- Maven仓库搭建和配置
maven在本地搭建仓库的实际需求maven在项目构建过程需要下载一些必要的软件包,这些默认的下载链接都是访问maven的远程中央仓库Central Repo.如果项目中的成员,每次第一次构建的时候都 ...
- 使用Jenkins配置Git+Maven的自动化构建
Jenkins是一个开源的持续集成工具,应用Jenkins搭建持续集成环境,可以进行自动构建.自动编译和部署,非常方便. 在服务器比较少的情况下,Jenkins的优势并不明显,但是随着项目发展,服务器 ...
- Spark笔记:复杂RDD的API的理解(上)
本篇接着讲解RDD的API,讲解那些不是很容易理解的API,同时本篇文章还将展示如何将外部的函数引入到RDD的API里使用,最后通过对RDD的API深入学习,我们还讲讲一些和RDD开发相关的scala ...