> 백엔드 개발 > PHP 튜토리얼 > WeChat 빨간 봉투의 알고리즘 구현에 대한 토론 (PHP 기반)

WeChat 빨간 봉투의 알고리즘 구현에 대한 토론 (PHP 기반)

伊谢尔伦
풀어 주다: 2016-11-26 17:10:45
원래의
1146명이 탐색했습니다.

오늘 밤 갑자기 생각이 나서 동문 위챗 그룹에 빨간 봉투를 보냈습니다. 빨간 봉투의 총 금액을 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 &#39;第&#39;.$i.&#39;个红包:&#39;.$money.&#39; 元,余额:&#39;.$total.&#39; 元 <br/>&#39;;
}
echo &#39;第&#39;.$num.&#39;个红包:&#39;.$total.&#39; 元,余额:0 元&#39;;
로그인 후 복사
입력 후 변동폭이 너무 크고 데이터가 너무 지루해요!

第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 &#39;第&#39;.$i.&#39;个红包:&#39;.$money.&#39; 元,余额:&#39;.$total.&#39; 元 <br/>&#39;;
}
echo &#39;第&#39;.$num.&#39;个红包:&#39;.$total.&#39; 元,余额:0 元&#39;;
로그인 후 복사
출력 결과는 아래 그림과 같습니다

第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 元
로그인 후 복사


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿