我们知道在js中可以使用parseInt生成n~m之间的随机数,边界范围需要不同情况来控制
在这篇博客中看到如下的生成方式:
生成 [n,m),包含n但不包含m的正整数: parseInt(Math.random()*(m-n)+n)
生成 (n,m],不包含n但包含m的正整数: parseInt(Math.random()*(m-n)+n)+1
生成 [n,m],包含n和m的随机数: parseInt(Math.random()*(m-n+1)+n)
生成 (n,m),不包含n和m的正整数:parseInt(Math.random()*(m-n-1)+n+1)
经验证确实实现了概率基本相等的随机数生成效果
在此基础上,我尝试了另一种方法
parseInt的效果其实应该与Math.floor类似
我们知道Math.random 获取到的随机数是在 [0,1),而Math.ceil 向上取整,Math.floor 向下取整
因此我通过以下尝试同样实现了四种范围的随机数生成:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><script>let n = 6; let m = 9;let count1 = {};let count2 = {};let count3 = {};let count4 = {};for (let i = 0; i < 10000; i++) {let num1 = Math.floor(Math.random() * (m - n)) + n;if (!count1[num1]) {count1[num1] = 1;} else {count1[num1]++;}}console.log('[${n},${m})', count1); //左闭右开for (let i = 0; i < 10000; i++) {let num2 = Math.floor(Math.random() * (m - n + 1)) + n;// let num2 = parseInt(Math.random() * (m - n + 1)) + n;if (!count2[num2]) {count2[num2] = 1;} else {count2[num2]++;}}console.log('[${n},${m}]', count2); //闭区间for (let i = 0; i < 10000; i++) {let num3 = Math.floor(Math.random() * (m - n - 1)) + n + 1;if (!count3[num3]) {count3[num3] = 1;} else {count3[num3]++;}}console.log('(${n},${m})', count3); //开区间for (let i = 0; i < 10000; i++) {let num4 = Math.ceil(Math.random() * (m - n) + n);if (!count4[num4]) {count4[num4] = 1;} else {count4[num4]++;}}console.log('(${n},${m}]', count4); //左开右闭</script></body></html>
同样得到如下结果:
如果觉得《JS生成指定范围内的正整数随机数》对你有帮助,请点赞、收藏,并留下你的观点哦!