首页 >> js开发 >> js代码JavaScript随机数的组合问题案例分析
js代码JavaScript随机数的组合问题案例分析
发布时间: 2021年1月13日 | 浏览:
| 分类:js开发
本文实例讲述了JavaScript随机数的组合问题。分享给大家供大家参考,具体如下:随机数的组合问题在面试时是经常考的,比如之前我就被问到:“有一个可以生成1-5的随机数函数,怎样把它扩大到1-7?”在解决这个问题之前,先来看看另外一个比较简单的问题:“有一个可以生成1-7的函数,怎样把它缩小到1-5?”下面是一个生成1-7函数random7:
function random7() {
return Math.floor(Math.random() * 7 + 1);
}
function random7() {
return Math.floor(Math.random() * 7 + 1);
}
如何把它转成生成1-5的函数呢?这很简单:在一个循环里面调用random7,直到它的值小于等于5就结束循环并返回该随机数即可,如下:
function random5() {
var r = random7();
while(r > 5) {
r = random7();
}
return r;
}
function random5() {
var r = random7();
while(r > 5) {
r = random7();
}
return r;
}
上面的思路就是:如果生成的随机数大于5,就继续调用random7,直到它小于等于5为止。好吧,回归正题,再来看一下1-5如何转成1-7吧。下面是一个随机生成1-5的函数:
function random5() {
return Math.floor(Math.random() * 5 + 1);
}
function random5() {
return Math.floor(Math.random() * 5 + 1);
}
我们现在的目的是要把它扩大到1-7。有一种很自然的想法可能就是:一个random5()产生的随机数范围是1-5,那么两个random5()相加的范围就是2-10了,再减去1就是1-9了,所以,可以按照上面的思路,在random7里来个循环,如果小于等于7就结束循环并且返回。如下:
function random7() {
var r = random5() + random5() - 1;
while(r > 7) {
r = random5() + random5() - 1;
}
return r;
}
function random7() {
var r = random5() + random5() - 1;
while(r > 7) {
r = random5() + random5() - 1;
}
return r;
}
这样确实可以把1-5的范围扩大到1-7,但是问题来了:所谓随机函数,产生的每个值的概率是相等的,但是上面的方法产生的值概率相等吗?我们可以使用概率论的组合知识算岀来:生成1有一种组合,就是random5() + random5() - 1;中的两个random5()均是1,生成2有两种组合,第一个random5()是1第二个是2,或者相反。显然,它们的概率是不等的。所以这种方法是不行的。为了实现生成的每个值的概率是相等的,就是使得每个值的组合数相等。一种可行的方法是使得每个值的组合只有一种,如下:
function random7() {
var r = (random5() - 1) * 5 + random5();
while(r > 7) {
r = (random5() - 1) * 5 + random5();
}
return r;
}
function random7() {
var r = (random5() - 1) * 5 + random5();
while(r > 7) {
r = (random5() - 1) * 5 + random5();
}
return r;
}
为什么这样就会使得各个值的概率相等呢?首先来看一下(random5() - 1) * 5,容易算岀这个表达式生成的可选值是0,5,10,15,20,用它去跟random5()相加,因为random5()的可选值是1, 2,3,4,5,所以两者相加之后就会得到1-25之间的随机数,而且产生的每个值的组合均只有一种,所以它们的概率也是相等的。也许有人会问,(random5() - 1) * 5,这里为什么是乘以5而不是其他呢?这是因为乘以5之后和random5()相加,得到的数是连续的并且是等概率的。上面讨论的都是特殊情形1-5和1-7之间的转换,对于其他的一般情形,大家可以自己试试哈。感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools./code/HtmlJsRun测试上述代码运行效果。在线HTML/CSS/JavaScript代码运行工具在线HTML/CSS/JavaScript代码运行工具http://tools./code/HtmlJsRun关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》JavaScript数据结构与算法技巧总结JavaScript数组操作技巧总结JavaScript数学运算用法总结JavaScript排序算法总结JavaScript遍历算法与技巧总结JavaScript查找算法技巧总结JavaScript错误与调试技巧总结希望本文所述对大家JavaScript程序设计有所帮助。
function random7() {
return Math.floor(Math.random() * 7 + 1);
}
function random7() {
return Math.floor(Math.random() * 7 + 1);
}
如何把它转成生成1-5的函数呢?这很简单:在一个循环里面调用random7,直到它的值小于等于5就结束循环并返回该随机数即可,如下:
function random5() {
var r = random7();
while(r > 5) {
r = random7();
}
return r;
}
function random5() {
var r = random7();
while(r > 5) {
r = random7();
}
return r;
}
上面的思路就是:如果生成的随机数大于5,就继续调用random7,直到它小于等于5为止。好吧,回归正题,再来看一下1-5如何转成1-7吧。下面是一个随机生成1-5的函数:
function random5() {
return Math.floor(Math.random() * 5 + 1);
}
function random5() {
return Math.floor(Math.random() * 5 + 1);
}
我们现在的目的是要把它扩大到1-7。有一种很自然的想法可能就是:一个random5()产生的随机数范围是1-5,那么两个random5()相加的范围就是2-10了,再减去1就是1-9了,所以,可以按照上面的思路,在random7里来个循环,如果小于等于7就结束循环并且返回。如下:
function random7() {
var r = random5() + random5() - 1;
while(r > 7) {
r = random5() + random5() - 1;
}
return r;
}
function random7() {
var r = random5() + random5() - 1;
while(r > 7) {
r = random5() + random5() - 1;
}
return r;
}
这样确实可以把1-5的范围扩大到1-7,但是问题来了:所谓随机函数,产生的每个值的概率是相等的,但是上面的方法产生的值概率相等吗?我们可以使用概率论的组合知识算岀来:生成1有一种组合,就是random5() + random5() - 1;中的两个random5()均是1,生成2有两种组合,第一个random5()是1第二个是2,或者相反。显然,它们的概率是不等的。所以这种方法是不行的。为了实现生成的每个值的概率是相等的,就是使得每个值的组合数相等。一种可行的方法是使得每个值的组合只有一种,如下:
function random7() {
var r = (random5() - 1) * 5 + random5();
while(r > 7) {
r = (random5() - 1) * 5 + random5();
}
return r;
}
function random7() {
var r = (random5() - 1) * 5 + random5();
while(r > 7) {
r = (random5() - 1) * 5 + random5();
}
return r;
}
为什么这样就会使得各个值的概率相等呢?首先来看一下(random5() - 1) * 5,容易算岀这个表达式生成的可选值是0,5,10,15,20,用它去跟random5()相加,因为random5()的可选值是1, 2,3,4,5,所以两者相加之后就会得到1-25之间的随机数,而且产生的每个值的组合均只有一种,所以它们的概率也是相等的。也许有人会问,(random5() - 1) * 5,这里为什么是乘以5而不是其他呢?这是因为乘以5之后和random5()相加,得到的数是连续的并且是等概率的。上面讨论的都是特殊情形1-5和1-7之间的转换,对于其他的一般情形,大家可以自己试试哈。感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools./code/HtmlJsRun测试上述代码运行效果。在线HTML/CSS/JavaScript代码运行工具在线HTML/CSS/JavaScript代码运行工具http://tools./code/HtmlJsRun关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》JavaScript数据结构与算法技巧总结JavaScript数组操作技巧总结JavaScript数学运算用法总结JavaScript排序算法总结JavaScript遍历算法与技巧总结JavaScript查找算法技巧总结JavaScript错误与调试技巧总结希望本文所述对大家JavaScript程序设计有所帮助。
相关文章:
- js关于angular浏览器兼容性问题的解决方案js大全
- js解决父组件将子组件作为弹窗调用只执行一次created的问题js大全
- jsvuex中store存储store.commit和store.dispatch的用法js大全
- jsvue+axios全局添加请求头和参数操作js大全
- jsvue data对象重新赋值无效(未更改)的解决方式js大全
- jsVUE项目axios请求头更改Content-Type操作js大全
- jsVue-CLI 3 scp2自动部署项目至服务器的方法js大全
- js解决vue的router组件component在import时不能使用变量问题js大全
- JavaScriptthree.js欧拉角和四元数的使用方法
- jsvue中全局路由守卫中替代this操作(this.$store/this.$vux)js大全