JavaScript随机数的组合问题案例分析
本文实例讲述了JavaScript随机数的组合问题。分享给大家供大家参考,具体如下
随机数的组合问题在面试时是经常考的,比如之前我就被问到“有一个可以生成1-5的随机数函数,怎样把它扩大到1-7?”
在解决这个问题之前,先来看看一个比较简单的问题“有一个可以生成1-7的函数,怎样把它缩小到1-5?”狼蚁网站SEO优化是一个生成1-7函数random7
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; }
上面的思路就是如果生成的随机数大于5,就继续调用random7,直到它小于等于5为止。好吧,回归正题,再来看一下1-5如何转成1-7吧。狼蚁网站SEO优化是一个随机生成1-5的函数
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; }
这样确实可以把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; }
为什么这样就会使得各个值的概率相等呢?来看一下(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代码运行工具测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题《》、《》、《》、《》、《》、《》及《》
希望本文所述对大家JavaScript程序设计有所帮助。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程