先让大家来看一幅图,这幅图是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哈哈~

转载于:https://www.cnblogs.com/kmsfan/p/5515523.html

Chrome V8引擎系列随笔 (1):Math.Random()函数概览相关推荐

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

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

  2. Chrome V8引擎介绍

    0.v8引擎出现的原因 这里先说一下什么是编译型语言和解释性语言: 编译型语言: 在程序执行之前必须进行专门的编译过程,有如下特点: 只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译, ...

  3. Chrome V8 引擎移植到 Android

    简介 Chrome V8 引擎是 Google 自己开发的 javascript 脚本引擎.开发语言为 C++. V8 github 页面 V8 官方博客 V8 开发者页面 在 Android 平台上 ...

  4. math.random()函数用法

    math.random()函数是取[0,1)之间的随机数,则math.random()*100表示[0,100)之间的随机数,(math.random()*40)*10表示[0,400)之间的随机数, ...

  5. chrome v8引擎

    v8对内存有限制: 1. v8引擎对浏览器设计的,不太可能大规模使用内存 2. v8垃圾回收限制内存 node.js对于v8引擎的限制 1. 64位操作系统,内存限制是1.4G 2. 32位操作系统, ...

  6. 实战:白话Math.random()函数使用说明

    Math.random()是返回一个Double类型的0到1的随机数  Math.random()*5就是把产生的数乘以5  0*5=0,1*5=5,也就是说变成了成0到5产生随机数  Math.ra ...

  7. Google V8 引擎

    V8的前世今生 V8是JavaScript渲染引擎,第一个版本随着Chrome的发布而发布(具体时间为2008年9月2日).在运行JavaScript之前,相比其它的JavaScript的引擎转换成字 ...

  8. 用java script随机数_js中Math.random()生成指定范围数值的随机数【转】

    Math.random函数就不像php的rand函数一样可以生成指数范围的数据了,math.random只是生成了一个伪随机数,之后还要经过我们处理才行哦. 今天又有网友问到我 JavaScript ...

  9. 外文翻译 | 你以为你会用Math.random() ? 不,你不会……

    文章目录 制造动画效果 HTML CSS JavaScript 电子音乐 HTML SCSS CoffeeScript 随机显示图片 HTML CSS JavaScript 随机背景颜色 Pug SC ...

最新文章

  1. 【小白的CFD之旅】14 实例反思
  2. Centos7.6 下部署Cobbler
  3. python 日志分析_python 日志分析统计脚本 | 学步园
  4. Nacos-Nacos和Eureka的对比
  5. oracle数据库用脚本运行SQL语句
  6. 重置mysql+密码_MySQL重置root密码的几种方法(windows+Linux)
  7. android 两点距离计算公式,Android 计算地球上任意两点(经纬度)距离
  8. 使用基于迭代的敏捷创建里程碑
  9. 用户名或密码错误html,用户名或密码错误【解决办法】
  10. 数字逻辑educoder实训项目 logisim实现 交通灯系统设计
  11. C# Delegate引介
  12. 移动硬盘 无法访问 解决方法
  13. SpringBoot POI Word合并
  14. Wi-Fi 6 提升了哪些方面?
  15. 基于HTML和HTML5
  16. 如何卸载mysql教程(完全卸载)
  17. Java开发笔记XML报文的解析
  18. 《SQL Server2008R2数据挖掘与商业智能》实例——决策树
  19. 算法岗面经总结(星环科技)
  20. 4.Jenkins跨站请求伪造保护关闭

热门文章

  1. word流程图整体怎么拆分_word流程图-不会做流程图?这三种方法超级简单!
  2. 读取html文件转换字符串,读取HTML文件,生成HTML字符串
  3. h5居中loading_实现整个html居中最简单方法
  4. html没有内容怎么爬,Url没有在网页中返回正确的html(对于我的Java爬虫)
  5. android kotlin log,Kotlin实现Log打印工具类
  6. python自动化测试学习有用吗_python自动化测试学习-UnitTest/PyUnit的用法介绍
  7. python建模 决策_决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:...
  8. uvc能支持多大分辨率_微信发送的视频不能大于25M?原来改个后缀就能发送,涨知识了...
  9. Python循环遍历(cycle)
  10. 国家二级计算机vb考试题型,2015全国计算机等级考试二级VB题型分析