先让大家来看一幅图,这幅图是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()函数概览的更多相关文章

  1. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  2. Chrome V8 引擎源码剖析

    Chrome V8 引擎源码剖析 V8 https://github.com/v8/v8 array & sort https://github.com/v8/v8/search?l=Java ...

  3. 浅谈Chrome V8引擎中的垃圾回收机制

    垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...

  4. Node.js和Chrome V8 引擎了解

    说起Node就不得不先介绍一个Chrome V8 引擎. 随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScr ...

  5. Math.random();函数 随机数

    random函数参数 无参数 random函数返回值 返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) random函数示例 document.write(Math.random()); ...

  6. Chrome V8引擎的一点认识

    最近在玩弄JavaScript ,也一直在捉摸,脚本Engine怎么解析你写的Code,对Google兴趣浓,索性就看了谷歌的脚本engine的官方资料,都是E文的,但是却是最纯的不是,看下来总结V8 ...

  7. V8引擎——详解

    前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力.编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进 ...

  8. v8引擎详解

    引用网址: https://blog.csdn.net/swimming_in_it_/article/details/78869549 前言 JavaScript绝对是最火的编程语言之一,一直具有很 ...

  9. 使用js Math.random()函数生成n到m间的随机数字

    何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备,Math.random()函数返回0和1之间的伪随机数   摘要: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后 ...

随机推荐

  1. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  2. C语言 · 4-3水仙花数

    问题描述 打印所有100至999之间的水仙花数.所谓水仙花数是指满足其各位数字立方和为该数字本身的整数,例如 153=1^3+5^3+3^3. 样例输入 一个满足题目要求的输入范例.例:无 样例输出 ...

  3. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

  4. PHP源码分析-变量

    1. 变量的三要素变量名称,变量类型,变量值 那么在PHP用户态下变量类型都有哪些,如下: // Zend/zend.h #define IS_NULL 0 #define IS_LONG 1 #de ...

  5. .NET Core的日志[3]:将日志写入Debug窗口

    定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...

  6. .net 分布式架构之任务调度平台

    开源地址:http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager .net 任务调度平台 用于.net dll,exe的任务的挂载, ...

  7. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  8. springMVC初探--环境搭建和第一个HelloWorld简单项目

    注:此篇为学习springMVC时,做的笔记整理. MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—& ...

  9. 重新认识了下Entity Framework

    什么是Entity Framework Entity Framework是一个对象关系映射O/RM框架. Entity Framework让开发者可以像操作领域对象(domain-specific o ...

  10. Java获取本机的IP与MAC地址

    有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...