函数canReward($rate){$mt_rand=mt_rand();$last=mt_getrandmax();return$mt_rand/$last<=$rate;}functiongetRandomVal($min,$max){//随机random=newround(0,);//返回random.nextInt($max-$min+1)+min;返回mt_rand(0,$max-$min+1)+$min;}functiongetRandomValWithSpecifySubRate($boundMin,$boundMax,$subMin,$subMax,$subRate){if(canReward($subRate)){returngetRandomVal($子最小值,$子最大值);}returngetRandomVal($boundMin,$boundMax);}/***随机分配第n个红包*@param$totalBonus红包总量*@param$totalNum总份数*@param$sendBonus发送红包数量信封*@param$sendedNum发送份数*@param$rdMin随机下限*@param$rdMax随机上限*@return*/functionrandomBonusWithSpecifyBound($totalBonus,$totalNum,$sendBonus,$sendedNum,$rdMin,$rdMax,$bigRate){$avg=$totalBonus/$totalNum;//平均值$leftLen=$avg-$rdMin;$rightLen=$rdMax-$avg;$boundMin=0;$boundMax=0;//大的时间电影小可以if($leftLen===$rightLen){$boundMin=max(($totalBonus-$sendBonus-($totalNum-$sendedNum-1)*$rdMax),$rdMin);$boundMax=min(($totalBonus-$sendBonus-($totalNum-$sendedNum-1)*$rdMin),$rdMax);}elseif(ord($leftLen)>0){//上限$standardRdMax=$avg+$leftLen;//右对称最大点$rdMax=canReward($bigRate)?$rdMax:$standardRdMax;$boundMin=max(($totalBonus-$sendBonus-($totalNum-$sendedNum-1)*$standardRdMax),$rdMin);$boundMax=min(($totalBonus-$sendBonus-($totalNum-$sendedNum-1)*$rdMin),$rdMax);}else{//下限偏移$standardRdMin=$avg-$rightLen;//左侧对称下限点$rdMin=canReward($bigRate)?$rdMin:$standardRdMin;$boundMin=max(($totalBonus-$sendBonus-($totalNum-$sendedNum-1)*$rdMax),$rdMin);$boundMax=min(($totalBonus-$sendBonus-($totalNum-$sendedNum-1)*$standardRdMin),$rdMax);}//发送平均偏移校正-动态比例if($boundMin===$boundMax){returngetRandomVal($boundMin,$boundMax);$currAvg=$sendedNum==0?$avg:($sendingBonus/$sendedNum);//当前发送的平均值$middle=($boundMin+$boundMax)/2.0;$subMin=$boundMin;$subMax=$boundMax;//期望值$exp=$avg-($currAvg-$avg)*$sendedNum/($totalNum-$sendedNum);如果($middle>$exp){$subMax=(int)round(($boundMin+$exp)/2.0);}else{$subMin=(int)round(($exp+$boundMax)/2.0);}$expBound=($boundMin+$boundMax)/2;$expSub=($subMin+$subMax)/2;$subRate=($exp-$expBound)/($expSub-$expBound);returngetRandomValWithSpecifySubRate($boundMin,$boundMax,$subMin,$subMax,$subRate);}/***java微信红包算法*/functiongetRand2($totalBonus,$totalNum,$rdMin,$rdMax,$bigRate){$sendBonus=0;$sendedNum=0;$bonusList=[];而($sendedNum<$totalNum){$bonus=randomBonusWithSpecifyBound($totalBonus,$totalNum,$sendBonus,$sendedNum,$rdMin,$rdMax,$bigRate);$bonusList[]=(int)$bonus;$sendedNum++;$sendBonus+=$bonus;}if(array_sum($bonusList)>$totalBonus)$bonusList[array_search(max($bonusList),$bonusList)]=$bonusList[array_search(max($bonusList),$bonusList)]-(array_sum($bonusList)-$总奖金);elseif(array_sum($bonusList)<$totalBonus)$bonusList[array_search(min($bonusList),$bonusList)]=$bonusList[array_search(min($bonusList),$bonusList)]+($totalBonus-array_sum($奖金清单));返回$bonusList;}$arr=getRand2(5300,80,50,400,0.8);var_dump($arr);var_dump(array_sum($arr));
