纯js实现随机整数[m,n],使用Math的方法处理出现概率不相等的问题

纯js实现随机整数[m,n],处理出现概率不相等的问题

1、可以使用 parseInt(取整)会智能识别 ceil(向上取整) floor(向下取整) round(四舍五入)

​ 直接上代码

法1:使用四舍五入

 			function randomRound(m, n) {

​     			 return Math.round((Math.random() * (n - m) + m)); 

​   			 }

   			 console.log(randomRound(3, 5));

法2 使用向下取整(parseInt和floor基本一致);

				function randomCeil(m, n) {

​      				return Math.ceil(Math.random() * (n - m) + m);  // 向上取整

​    			}

​    			console.log(randomCeil(3, 5));

法3 使用向上取整

				function randomFloor(m, n) {

​      			return Math.floor((Math.random() * (n - m + 1) + m));  // 向下取整

​    			}

​    			console.log(randomFloor(3, 5));

方法1: 四舍五入出现的整数的概率是不均等的,假设按照 0-1 为一个区间算。

				m 出现的概率是  半个区间

​				m+1 出现的概率是  一个区间

​				......

​				n 出现的的概率是 半个区间

方法2:向上取整 ceil 出现的概率任然是不均等的

			m 出现的概率 ,相当于  random()中 0 出现的概率。  

​				测试一个    Math.random()     
						   0.009367313405289845

​			m+1 出现 为一个区间

​			......

​			n  出现的概率为一个区间

方法3:向下取整,floor这个出现的概率还算是基本均等,和parseInt 基本一致。

方法2的改造。

 	function randomCeil2(m, n) {

​      return Math.ceil(Math.random() * (n - m + 1) + m - 1);

​    }

​    console.log(randomCeil2(3, 5));

思路,刚开始的Math.random * (n - m) 区间为 [0 , n)

​ 使区间变大一位 Math.random * ( n - m + 1) 区间变为 [0 , n - m + 1)

​ 加上基础值, Math.random * ( n - m +1 ) + m 区间变为 [m , n + 1)

​ 减去多加的1 , 区间变为 [m - 1, n);

​ 向上取整 区间变为 [m - 1 , n];

此时 m - 1 取到的概率,就像是 Math.random() 的0 取到的概率一样低

​ m 的概率为 一个区间

​ m+1 的概率为 一个区间

​ …

​ n的概率为 一个区间, 可以保证概率大致相等

综上,可以选择 parseInt floor Ceil的改造版。

发布了7 篇原创文章 · 获赞 1 · 访问量 221

猜你喜欢

转载自blog.csdn.net/qq_35898059/article/details/103408739