要实现的功能是发一个随机红包,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.你的算法大概的思路是:
取一个0~2的随机数,保证这个随机数不能大于p(当前剩下的钱)
随机取数组中的一项(随机选一个人)
判断取出的这一项加上n后不能大于6(取出的这个人现在的钱加上n后不能超过6块钱),如果超过6,再重新随机取一项...直到找到加上n后不超过6的
给当前取出的这一项加上n(给满足条件的随机取出来的这个人再加上n块钱),然后更新还剩的总钱数
p -= n
再进入最外面的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"));
总体思路就是这样的,有什么不明白的可以再问我~