引子:
    在写程序间突然需要用到随机数,于是用到了js的Math.random随机函数,生成指定范围内的随机数,根据网上流传的写法生成指定范围内的随机数如下

function random(min, max){
return Math.round(Math.random()*(max-min))+min;
} var zero = one = two = three = 0;
for(var i=0;i<10000;i++){
var num = random(0,3);
if(num==0){
zero++;
}else if(num==1){
one++;
}else if(num==2){
two++;
}else if(num==3){
three++;
}else{
console.log("assert false");
}
}
console.log(zero,one,two,three);

经过10000次计算,在0-3范围内生成的结果数据如下,0=1670次 1=3348次 2=3266次 3=1717次
发现这个算法略坑,min以及max的边界命中率简直低的可怜,根本不是均匀分布,反而有点像正态分布,只能改进重写了

Math.random()函数

  根据官方的定义:random() 方法可返回介于 0 ~ 1 之间的一个随机数。那么猜想在0~1之间,如果对生成的随机数进行四舍五入,那么该概率在(0,1)是呈均匀分布状态,也就是说出现0或者是1的概率是相等的,接下来验证猜想

function guess(){
var zero = 0;
var one = 0;
for(var i=0;i<100000;i++){
Math.round(Math.random()) ==1 ? one++ : zero++;
}
return zero+" "+one;
} for(var i=0;i<10;i++){
var g = guess();
console.log(g);
}

运行结果如下
50093  49907
49787  50213
49862  50138
49948  50052
49820  50180
50158  49842
50179  49821
49967  50033
49920  50080
50063  49937
从数据结果中可以看出,对随机数四舍五入之后,出现0和出现1的概率呈均匀分部状态,测试次数无穷大的情况下,那么出现1或0的概率的极限都是1/2,根据这个特性,由二进制开始联想,那么在指定位数的情况下,在这个区间内,每一个数出现的概率也是均匀分布的,概率各为1/2^n,于是就有了下面的验证程序如下

var Helpers = {
getbit: function(num){
var bit = 0;
while(num>0){
num = num>>1;
bit++;
}
return bit;
},
randomBin : function(times){
var num = Math.round(Math.random());
while(times>1){
num = (num<<1) + Math.round(Math.random());
times--;
}
return num;
},
random : function(min,max){
var num = max-min;
var times = this.getbit(num);
do{
var binNum = this.randomBin(times);
}while(!(binNum<=num));
return binNum+min;
}
} var zero = one = two = three = 0;
for(var i=0; i<=10000; i++){
var n = Helpers.random(0,3);
if(n == 0){
zero++;
}else if(n == 1){
one++;
}else if(n == 2){
two++;
}else if(n == 3){
three++;
}
}
console.log(zero,one,two,three);

运行10000次的结果:2523 2548 2416 2514 ,根据数据可以看出,这种生成随机数的方式比之第一种要更加的均匀

尾语:

  虽然复用代码是一个好习惯,但是不要盲目的去复用他人的代码,靠巧合编程是无法长久的,惟有不断的提升自己,才会觉得数学与计算机真的是非常的有趣。

js随机数的更多相关文章

  1. js 随机数生成器

    title: js 随机数生成器 js 随机数生成器 js 随机数生成器 确定产生随机数的数目,最小值和最大值: 个数: 最小值: 最大值: 是否为唯一的随机数: 唯一 允许重复 点击生成产生随机数: ...

  2. js随机数 从头开始系列

    js要常常写啊要不然就要从0开始 1 var num = Math.random(); //创建一个0-1随机数字 num*=10 //变为0-10随机数字 //有好几种取整方式 var i = Ma ...

  3. js 随机数 洗牌算法

    function shuffle(arr){ var len = arr.length; for(var i = 0;i<len -1;i++) { var idx = Math.floor(M ...

  4. JS 随机数

    function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random(); return(Min + Math.r ...

  5. Js随机数--网页版的体育彩票选号器

    <script> function Quickpick() { var ball for( ball = 0; ball < 5; ball++) { this[ball] = pa ...

  6. JS随机数不重复

    方法一 思路:首先创建一个1到3000的数组,每次取一个数,然后去除数组中取出的这个数, 这样就可以实现永不重复. var count=3000; var originalArray=new Arra ...

  7. js随机数的取整

  8. cocos2d-x JS 随机数

    random4 : function (n, m){ var random = Math.floor(Math.random()*(m-n+1)+n); return random;},

  9. js随机数算法

    function rnd( seed ){ seed = ( seed * 9301 + 49297 ) % 233280; //为何使用这三个数? return seed / ( 233280.0 ...

随机推荐

  1. jQuery之DOM属性

    1. .addClass()方法:为每个匹配的元素添加指定的样式类名.值得注意的是设个方法不会替换一个样式类名.他只是简单的添加一个样式类名到元素上.对所有匹配的元素可以一次添加多个用空格隔开的样式类 ...

  2. VMware安装Centos7,已将该虚拟机配置为使用64为,却无法执行64位操作

    在新建虚拟机之后,相信很多人都遇到了这个问题,这个问题的本质就是电脑是否支持虚拟化,虽然不是很清楚这是什么 解决方案就是,重启电脑(这边的电脑不是虚拟机而是主机),进入BIOS界面(不同电脑进入BIO ...

  3. 线段树 poj 2991

    我们只要把这些向量求和,最终所指的位置就是终点,因此我们只要维护好向量的区间和就可以了.对于第二个问题,我们可以用一个数组degree[i]表示第i个向量和第i-1一个向量当前的夹角,这样就有了当前的 ...

  4. android MVC && MVP && MVVM分析和对比

    相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...

  5. 运行tomcat8w.exe未安装指定的服务

    1.报错:指定的服务未安装. 2:解决方案有些写的不够详细,现在发表一遍详细操作手册 以上是解决方案备忘录

  6. 【团队项目选题】自选项目:桌游APP

    由于我们团队的黄金点游戏结果是第二名,按理说是一定能选到一个自选项目的,所以以下只列出我们选择的自选项目 自选项目名称 桌游APP   暂定 (名字还没想好) 项目大致介绍 此APP集成了多种桌游,主 ...

  7. 上传github代码

    github 自己理解的使用方法 摸索了半天时间了,连查再找 百度 GOOGLE的 真是费了不少劲呀,不过 网上的这个教程 那个教程 看的真是一头雾水呀,很多都是贴过来贴过去 ,不过 还是帮助我不少, ...

  8. Maven+Spring MVC Spring Mybatis配置

    环境: Eclipse Neon JDK1.8.0 Tomcat8.0 先决条件: Eclipse先用maven向导创建web工程.参见本站之前随笔. 本机安装完成mysql5:新建用户xuxy03设 ...

  9. 利用Python【Orange】结合DNA序列进行人种预测

    http://blog.csdn.net/jj12345jj198999/article/details/8951120 coursera上 web intelligence and big data ...

  10. AE开发能否实现TOC Control里添加多个Data Frame

    问题: 在ArcMap中,菜单Insert下Data Frame,可以在TOC中增加Data Frame,在MapControl或者PageLayoutControl下都可以正常显示多个Data Fr ...