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间的随机数字,主要目的是为后 ...
随机推荐
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- iframe用法
<iframe src="http://caiyanli.top/" height="500" width="500" frameb ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的
我们在<服务器在管道中的"龙头"地位>中对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了介绍,为了让读者朋友们对管道中的服务器具有更 ...
- mac下安装及配置tomcat
mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...
- 简单搭建 nuget 内部服务器
搭建 nuget 内部服务器,最好的方式是使用 ProGet,参考博文<用 ProGet 搭建内部的 NuGet 服务器>,好处非常多,但需要使用 SQL Server 数据库,如果不想使 ...
- PHP的学习--RSA加密解密
PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...
- 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版
背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- Javascript学习笔记
Javascript 2016年12月19日整理 JS基础 Chapter1 JS是一门运行在浏览器客户端的脚本编程语言,前台语言 组成部分 1. ECMAscript JS标准 2. DOM 通过J ...
- ViewController respondsToSelector 错误的解决方法
原因解析:(来自别人博客分析)某个公共类或系统提供的控件,存在delegate方法,当创建此公共控件的容器类已经销毁,而这个控件对应的服务是在其它run loop中进行的,控件销毁或者需要进行状态通知 ...