오늘 밤 갑자기 생각이 나서 동문 위챗 그룹에 빨간 봉투를 보냈습니다. 빨간 봉투의 총 금액을 10위안으로 설정하여 28명이 무작위로 받을 수 있도록 했습니다.
흥미로운 결과가 나왔습니다.
A가 0.26위안 받았습니다
B가 0.29위안을 받았습니다
C가 0.02위안을 받았습니다
D가 0.56위안을 받았습니다
E가 0.64위안을 받았습니다
...
WeChat은 이를 위해 어떤 알고리즘을 사용하나요? 방금 Baidu를 확인해 보니 아직 공식적인 설명이 없습니다. Zhihu에는 상대적으로 인기 있는 토론만 있습니다. 링크를 보려면 여기를 클릭하세요. 하지만 그들의 토론은 너무 심층적이어서 함정인 것 같습니다.
저만의 논리에 따라 시도해 보았습니다. 이 알고리즘은 다음 요구 사항을 충족해야 합니다.
1. 모든 사람이 빨간 봉투를 받을 수 있어야 합니다.
2. 모두 개인이 받은 빨간 봉투 금액의 합 =
3. 사람마다 받은 빨간 봉투의 금액은 다르지만 너무 다를 수는 없습니다. >
4. 알고리즘은 단순해야 합니다. 그렇지 않으면 Tencent의 서명이 실패합니다. 정식 코딩 전에 먼저 진보적인 모델을 구축하여 규칙을 분석합니다. 총량을 10으로 설정합니다. 만원, N명이 무작위로 받습니다 :N=1 则红包金额=X元; N=2 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数 第二个红包=10-第一个红包金额; N=3 红包1=0.01至0.98之间的某个随机数 红包2=0.01至(10-红包1-0.01)的某个随机数 红包3=10-红包1-红包2 ……이때 패턴이 나타납니다! 코딩을 시작해보세요!
header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10;//红包总额 $num=8;// 分成8个红包,支持8人随机领取 $min=0.01;//每个人最少能收到0.01元 for ($i=1;$i<$num;$i++) { $safe_total=$total-($num-$i)*$min;//随机安全上限 $money=mt_rand($min*100,$safe_total*100)/100; $total=$total-$money; echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>'; } echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';입력 후 변동폭이 너무 크고 데이터가 너무 지루해요!
第1个红包:7.48 元,余额:2.52 元 第2个红包:1.9 元,余额:0.62 元 第3个红包:0.49 元,余额:0.13 元 第4个红包:0.04 元,余额:0.09 元 第5个红包:0.03 元,余额:0.06 元 第6个红包:0.03 元,余额:0.03 元 第7个红包:0.01 元,余额:0.02 元 第8个红包:0.02 元,余额:0 元개선하여 평균값을 랜덤 안전 상한으로 활용하여 변동차를 조절
header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10;//红包总额 $num=8;// 分成8个红包,支持8人随机领取 $min=0.01;//每个人最少能收到0.01元 for ($i=1;$i<$num;$i++) { $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限 $money=mt_rand($min*100,$safe_total*100)/100; $total=$total-$money; echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>'; } echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';출력 결과는 아래 그림과 같습니다
第1个红包:0.06 元,余额:9.94 元 第2个红包:1.55 元,余额:8.39 元 第3个红包:0.25 元,余额:8.14 元 第4个红包:0.98 元,余额:7.16 元 第5个红包:1.88 元,余额:5.28 元 第6个红包:1.92 元,余额:3.36 元 第7个红包:2.98 元,余额:0.38 元 第8个红包:0.38 元,余额:0 元