给个100级的号,给100块30年前钱的点卡,30分

面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分? - 推酷
面试问题:发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
这问题是@xinhaip从那边看来。
他之前的思路是这样子:
以前想过一个类似问题,就是没有每个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。
于是这个问题也被以前的思想带坑里了,把突破口完全放在了如何处理每个人的随机数上。
于是在面试时间就没有解决这个问题,直到面试结束自己安静下来,仔细想想,发现思路错了。
在我看来其实他一开始的思路恰恰是正确的,然而我在他的问题下面发布了***,却没什么人赞同。
我只能在自己写个文章分析下我的解题思路。
发一个随机红包,100块钱给10个人。每个人最多12块钱,最少6块钱。怎么分?
,则题目可以得到以下结论
6n &= sum &= 12n
为随机红包的大小,则可以推出
6(n-1) &= (sum-randNum) &= 12(n-1)
从上面的结论里我们可以得到以下***
function makeSeq(){
$sum = 100;
$result = [];
while ($n & 1) {
// 6n &= sum &=12n
$randNum = mt_rand(600,1200) / 100;
if(($sum-$randNum) &= 6* ($n - 1) && ($sum-$randNum) &= 12* ($n - 1)){
$sum -= $randN
$result[] = $randN
$result[] = $
上面的***效率不是很高,其实我们可以通过计算红包的上下界,然后通过一次随机得到***。
6(n-1) &= (sum-randNum) &= 12(n-1)
sum - 12(n-1) &= randNum &= sum - 6(n-1)
6 &= randNum &= 12
计算得到红包的上下界:
$min = ($sum - 12 * ($i-1))&6?($sum - 12 * ($i-1)):6;
$max = ($sum - 6 * ($i-1))&12?($sum - 6 * ($i-1)):12;
则最终***是
function makeSeq2(){
$sum = 100;
$result = [];
for($i=$n;$i&=1;$i--){
$min = ($sum - 12 * ($i-1))&6?($sum - 12 * ($i-1)):6;
$max = ($sum - 6 * ($i-1))&12?($sum - 6 * ($i-1)):12;
$randNum = mt_rand($min,$max);
$sum -= $randN
$result[] = $randN
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

参考资料

 

随机推荐