首页 > javascript的问题,第二个while那句什么意思?

javascript的问题,第二个while那句什么意思?

要实现的功能是发一个随机红包,40块钱给10个人。每个人最多6块钱。

var arr = [];
var p = 40;
for (var i = 0; i < 10; i++)
    arr[i] = 0;
while (p>0) {
    var n = Math.min(p, Math.random()*2);//为什么是乘于2
    p -= n;
    var i;
    while (arr[i=Math.random()*10>>0]+n>6);//这句啥意思,没看懂
    arr[i] += n;   
}
alert(arr.join("\n"));

最关键的是

Math.random()*10>>0 //位运算右移0位,其实就是取整。随机一个0~9的数

防止随机数等于0


首先这个代码还是有点小问题,以元为单位的话,这个结果应该保留到小数点最后2位的,分以下的单位怎么分钱。。。

然后这个while是这么解释:防止某个人分到的大于6,如果随机抽取一个人,这个人现有的+这次要分的>6,那么循环成立,重新随机抽一个人,如果还是如此再随机抽,否则就让这个人的钱=现有的+这次要分的


1.Math.random()是取一个0~1之间的随小数,包含多位小数点。取n~m之间的随机数的公式是

Math.random() * (m - n) + n;
//如取0~2之间的随机数
Math.random() * (2 - 0 ) + 0;  //相当于Math.random() *2

2.你的算法大概的思路是:

  1. 取一个0~2的随机数,保证这个随机数不能大于p(当前剩下的钱)

  2. 随机取数组中的一项(随机选一个人)

  3. 判断取出的这一项加上n后不能大于6(取出的这个人现在的钱加上n后不能超过6块钱),如果超过6,再重新随机取一项...直到找到加上n后不超过6的

  4. 给当前取出的这一项加上n(给满足条件的随机取出来的这个人再加上n块钱),然后更新还剩的总钱数 p -= n

  5. 再进入最外面的while循环,再随机给一个人加一个随机的0~2的数,直到剩下的钱都分完了p < 0,跳出循环,分钱结束

3.关于while (arr[i=Math.random()*10>>0]+n>6);,这行代码的作用是随机取数组arr中的一项,判断其加上n后是否大于6,如果大于6,再重新取数组中的一项,在判断...直到找到不大于6的,就是我们要给他加钱的那个人,并且这时while条件已经不满足,跳出这行的while循环,让不大于6的这一项加上前面的随机数,执行arr[i] += n;它的功能相当于下面的代码:

var arr = [];
var p = 40;
for (var i = 0; i < 10; i++)
    arr[i] = 0;
while (p>0) {
    var n = Math.min(p, Math.random()*2);//取0~2之间的一个随机数
    p -= n;
    
    var i = Math.random()*10>>0; //取一个0~9的随机数,相当于Math.floor(Math.random()*10)
    
    while(arr[i] + n > 6) { 
        /* 当前项+n已经超过6,为了保证每个人都不能超过6块,不能再给他加n了
         * 需要再重新随机取一项,接着在进入while条件判断
         */
         
         i = Math.random()*10>>0; 
         
        /* 直到找到加上n后不大于6的那项,才会跳出循环 */
         
        
    } 
    
    // 这时的arr[i]肯定是加上n后不能超过6的那项
    arr[i] += n;   
}
alert(arr.join("\n"));

总体思路就是这样的,有什么不明白的可以再问我~

【热门文章】
【热门文章】