js随机数
引子:
在写程序间突然需要用到随机数,于是用到了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随机数的更多相关文章
- js 随机数生成器
title: js 随机数生成器 js 随机数生成器 js 随机数生成器 确定产生随机数的数目,最小值和最大值: 个数: 最小值: 最大值: 是否为唯一的随机数: 唯一 允许重复 点击生成产生随机数: ...
- js随机数 从头开始系列
js要常常写啊要不然就要从0开始 1 var num = Math.random(); //创建一个0-1随机数字 num*=10 //变为0-10随机数字 //有好几种取整方式 var i = Ma ...
- js 随机数 洗牌算法
function shuffle(arr){ var len = arr.length; for(var i = 0;i<len -1;i++) { var idx = Math.floor(M ...
- JS 随机数
function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random(); return(Min + Math.r ...
- Js随机数--网页版的体育彩票选号器
<script> function Quickpick() { var ball for( ball = 0; ball < 5; ball++) { this[ball] = pa ...
- JS随机数不重复
方法一 思路:首先创建一个1到3000的数组,每次取一个数,然后去除数组中取出的这个数, 这样就可以实现永不重复. var count=3000; var originalArray=new Arra ...
- js随机数的取整
- cocos2d-x JS 随机数
random4 : function (n, m){ var random = Math.floor(Math.random()*(m-n+1)+n); return random;},
- js随机数算法
function rnd( seed ){ seed = ( seed * 9301 + 49297 ) % 233280; //为何使用这三个数? return seed / ( 233280.0 ...
随机推荐
- Google开源库-Volley的使用
一.什么是Volley? Volley is an HTTP library that makes networking for Android apps easier and most import ...
- #MySQL 5.7.8 支持Json类型
As of MySQL 5.7.8, MySQL supports a native JSON data type that enables efficient access to data in J ...
- Alpha阶段发布说明
Alpha版本功能介绍 机器法官功能已实现 这是我们统计了当下所有存在的狼人APP的共同缺点.也是用户最主要的痛点.现在所有已知存在的类似APP都不能提供法官功能,我们的APP将该功能革命性的自动实现 ...
- 关于 DataGridTextColumn的IsReadOnly
1. 以下是绑定方式,但是IsReadOnly不起作用 <DataGrid x:Name="dgTest" ItemsSource="{Binding}" ...
- Theano: CNMeM is disabled, CuDNN not available
Problem Theano: CNMeM is disabled, CuDNN not available Solution cnmem package: https://github.com/NV ...
- VMware 虚拟上网的的三种模式 ——bridged、host-only、NAT 模式
恐怕这是今年在上海的最后的一篇博客了,同事们上班都不工作了,我也没有什么事情要做.为什么要写这篇博客呢,原因是我回家要带上自己的笔记本,里面装了一个虚拟机.平时自己的学习和工作都是在虚拟机里进行的.回 ...
- jmeter测试 常用数据库的性能
在线程组中设置线程属性,执行次数=线程数*循环次数 本次JOB共插入了5W条记录,从14:56:46开始到15:01:29结束共耗时343s,平均145.8条/s. 同理sql sever:从15:2 ...
- Css中的Position属性
Css中的Position属性 Css属性在线查询地址: http://www.css88.com/book/css/properties/index.htm CSS 中的 position 属性 在 ...
- lodop打印控件
http://www.c-lodop.com/demolist/PrintSampIndex.html
- ThinkPhP 分页
<?php namespace User\Service; use Think\Controller; use Think\Exception; class UserService { // 每 ...