백엔드 개발 PHP 튜토리얼 大家在抢红包,程序员在研究红包算法_PHP

大家在抢红包,程序员在研究红包算法_PHP

May 30, 2016 am 08:44 AM
위챗 빨간 봉투

除夕全天微信用户红包总发送量达到10.1亿次,摇一摇互动量达到110亿次,红包峰值发送量为8.1亿次/分钟。

抛开微信红包的市场价值不谈,红包本身的算法也引发了热议,由于官方没有给出明确的说法,各家也是众说纷纭,小编下面也为大家带来几种分析。

首先看看数据分析帝

大多数人都做出自己的猜测,这也是在不知道内部随机算法的时候的唯一选择,但是大多数人没有给出自己亲自的调查结果。这里给出一份100样本的调查抽样样本数据,并提出自己的猜测。

1. 钱包钱数满足截尾正态随机数分布。大致为在截尾正态分布中取随机数,并用其求和数除以总价值,获得修正因子,再用修正因子乘上所有的随机数,得到红包价值。

这种分布意味着:低于平均值的红包多,但是离平均值不远;高于平均值的红包少,但是远大于平均值的红包偏多。


图1. 钱包价值与其频率分布直方图及其正态拟合

但看分布直方图并不能推出它符合正态分布,但是考虑到程序的简洁性和随机数的合理性,这是最合乎情理的一种猜测。
越是后面的钱包,价值普遍更高


图2. 钱包序列数与其价值关系曲线

从图2中的线性拟合红线可以看到,钱包价值的总体变化趋势是在慢慢增大,其变化范围大约是一个绿色虚线上下界划出的“通道”。(曲线可以被围在这么一个正合乎常规的“通道”中,也从侧面反映了规律1的合理性,说明了并不是均匀分布的随机数)
从另一个平均数的图中也可以看出这一规律。


图3. 平均数随序列数的变化曲线

在样本中,1000价值的钱包被分成100份,均值为10。然而在图3中我们可以看到在最后一个钱包之前,平均数一直低于10,这就说明了一开始的钱包价值偏低,一直被后期的钱包价值拉着往上走,后期的钱包价值更高。

3. 当然平均数的图还可以透露出另一个规律,那就是最后的那一个人往往容易走运抽得比较多。因为最后那一个人是钱包剩下多少就拿多少的,而之前所有人的平均数 都低于10,所以至少保证了最后一个人会高于平均值。在本样本中,98号钱包抽到35,而最后一份钱包抽到46。

综上,根据样本猜测:


1. 抽到的钱大多数时候跟别人一样少,但一旦一多,就容易多很多。
2. 越是抽后面的钱包,钱越容易多。
3. 最后一个人往往容易撞大运。

点评:这种明显很实际有差异,小编每次不管什么时候抢都是几毛钱。

第二位同学写了一个简单python 代码

据观察,红包分钱满足以下几点:

1.不会有人拿不到钱

2.不会提前分完

3.钱的波动范围很大

红包在一开始创建的时候,分配方案就订好了。抢红包的时候,不过是挨个pop up而已。

因此 python 代码如下:

def weixin_divide_hongbao(money, n): 
divide_table = [random.randint(1, 10000)
for x in xrange(0, n)] 
sum_ = sum(divide_table) 
return [x*money/sum_ for x in divide_table] 
로그인 후 복사

不过上述算法还有两个小问题:

1.浮点数精度问题

2.边界值的处理

第三位同学按照网上流传的python写了一个java的版本

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"个人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"个人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本轮发红包中第"+(math.indexOf(Collections.max(math))+1)+"个人手气最佳"); 
j++; 
}
로그인 후 복사
로그인 후 복사

第四位同学的这种算法看起来非常科学。

他认为:

1、每个人都要能够领取到红包;

2、每个人领取到的红包金额总和=总金额;

3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味;

4、算法一定要简单,不然对不起腾讯这个招牌;

正式编码之前,先搭建一个递进的模型来分析规律

设定总金额为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

……

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"个人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"个人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本轮发红包中第"+(math.indexOf(Collections.max(math))+1)+"个人手气最佳"); 
j++; 
} 
로그인 후 복사

输入一看,波动太大,这数据太无趣了!

第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 元

改良一下,将平均值作为随机安全上限来控制波动差

int j=1; 
while(j<1000) 
{ 
int number=10; 
float total=100; 
float money; 
double min=0.01; 
double max; 
int i=1; 
 
List math=new ArrayList(); 
while(i<number) 
{ 
 
max = total- min*(number- i); 
int k = (int)((number-i)/2); 
if (number -i <= 2) 
{k = number -i;} 
max = max/k; 
money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
money=(float)money/100; 
total=total-money; 
math.add(money); 
System.out.println("第"+i+"个人拿到"+money+"剩下"+total); 
i++; 
if(i==number) 
{ 
math.add(total); 
System.out.println("第"+i+"个人拿到"+total+"剩下0"); 
} 
} 
 
System.out.println("本轮发红包中第"+(math.indexOf(Collections.max(math))+1)+"个人手气最佳"); 
j++; 
}
로그인 후 복사
로그인 후 복사

输出结果见下图

第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 元

小结:

小编觉得这完全可以理解成一个红包引发的血案,小编仅仅列举了几个,还有一些工程学的同学直接抛出了数学模型、离散函数等等,但是无论算法是简单还是复杂,玩的开心就够了。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

보낼 수 있는 WeChat 빨간 봉투의 최대 금액은 얼마입니까? 보낼 수 있는 WeChat 빨간 봉투의 최대 금액은 얼마입니까? Feb 23, 2024 pm 04:40 PM

보낼 수 있는 WeChat 빨간 봉투의 최대 금액은 얼마입니까? WeChat에서 보낼 수 있는 빨간 봉투의 양에는 상한선이 있으며 일부 사용자는 WeChat에서 보낼 수 있는 빨간 봉투의 최대 양에 대해 명확하지 않습니다. 특별한 날짜가 아닌 경우 최대 금액은 200입니다. 다음은 편집자가 사용자에게 가져오는 빨간 봉투의 최대 수량에 대한 소개입니다. 관심 있는 사용자가 와서 살펴볼 수 있습니다! WeChat 사용 튜토리얼 WeChat 상태 배경 이미지 설정 방법 답변: 200위안 세부 정보: 1. WeChat 빨간 봉투 금액 상한: 200. 1인당 위챗 빨간 봉투로 보낼 수 있는 최대 금액은 200위안입니다. 2. 특별 빨간 봉투 금액: 매년 5월 20일에 사용자는 빨간 봉투를 보낼 수 있으며 한도는 520위안입니다.

WeChat 빨간 봉투를 반환하는 방법 WeChat 빨간 봉투를 거부하고 상대방에게 즉시 반환하는 방법은 무엇입니까? WeChat 빨간 봉투를 반환하는 방법 WeChat 빨간 봉투를 거부하고 상대방에게 즉시 반환하는 방법은 무엇입니까? Feb 22, 2024 pm 04:43 PM

현재 WeChat 빨간 봉투는 수동 반품을 지원하지 않습니다. 튜토리얼 적용 모델: iPhone13 시스템: iOS15.5 버전: WeChat 8.0.19 분석 1 현재 WeChat 빨간 봉투는 청구되지 않은 WeChat 빨간 봉투에 대해 수동 반환을 지원하지 않습니다. 24시간 후에는 원래 계좌로 돌아가므로, 빨간 봉투를 받은 후 반품을 원할 경우, 당사가 이를 수락하지 않는 한 24시간 후에 자동으로 반품됩니다. 보충: WeChat 이체 반환 방법 1 WeChat 채팅 인터페이스에서 반환해야 하는 이체를 클릭합니다. 2이체 세부정보 화면에서 환불 옵션을 클릭하세요. 3. 새로 나타나는 팝업창에서 복귀를 다시 클릭하세요. 요약/참고: 현재 WeChat 빨간 봉투는 수동 반품을 지원하지 않습니다. 빨간 봉투를 받은 후 당사가 이를 수락하지 않는 한 24시간 후에 반품됩니다.

WeChat 빨간 봉투 반환을 위한 세부 단계 WeChat 빨간 봉투 반환을 위한 세부 단계 Mar 25, 2024 am 11:21 AM

1. WeChat 애플릿을 찾습니다. 2. 클릭하여 [Tencent Report Acceptance Center]를 검색합니다. 3. 인터넷 사기 옵션을 클릭하세요. 4. 관련 정보와 스크린샷을 입력하세요. WeChat 빨간 봉투 지침: 1. WeChat 빨간 봉투가 24시간 이내에 수집되지 않으면 직접 반환됩니다. 2. WeChat 빨간 봉투는 타인이 수집하며 귀하는 반환할 수 없습니다.

WeChat 빨간 봉투를 반환하는 방법은 무엇입니까? WeChat 빨간 봉투 반품 처리 방법 WeChat 빨간 봉투를 반환하는 방법은 무엇입니까? WeChat 빨간 봉투 반품 처리 방법 Mar 12, 2024 pm 05:00 PM

위챗(WeChat)은 소셜 네트워킹, 결제, 쇼핑 등의 기능을 통합한 모바일 애플리케이션으로 사용자들에게 큰 사랑을 받고 있다. 그 중 WeChat 빨간 봉투는 결제 기능의 일부로 편리함과 재미로 인해 대다수 사용자의 호감을 얻었습니다. 그러나 때로는 잘못된 빨간 봉투가 전송되는 상황이 발생할 수 있습니다. WeChat 빨간 봉투를 반송하는 것이 약간 번거로울 때도 있지만, WeChat 빨간 봉투를 사용할 때는 정보를 주의 깊게 확인하여 각 발송이 정확한지 확인하시기 바랍니다. WeChat 빨간 봉투를 반환하는 방법은 무엇입니까? WeChat 빨간 봉투 반품 처리 방법 WeChat 빨간 봉투 반품 방법은 주로 빨간 봉투 수신 여부에 따라 다릅니다. 빨간 봉투를 받지 못한 경우 다음과 같은 처리 방법이 있습니다. 상황 1: 상대방이 빨간 봉투를 받지 못한 경우 상대방에게 직접 연락하여 잘못된 빨간 봉투가 발송되었음을 알릴 수 있습니다. 상대방에게 받지 말라고 하세요. 24시간 이상

WeChat 빨간 봉투에 대한 알림을 설정하는 구체적인 방법 WeChat 빨간 봉투에 대한 알림을 설정하는 구체적인 방법 Mar 25, 2024 pm 05:46 PM

1. Tencent Butler를 다운로드합니다. 2. Tencent Mobile Butler를 찾습니다: [유틸리티] - [더보기]. 3. [빨간 봉투 알람시계]를 클릭하세요. 4. WeChat 및 QQ 옵션이 표시되면 아래 버튼 중 하나를 클릭하여 엽니다. 5. 그런 다음 연 후 인터페이스를 보거나 오른쪽 상단에 있는 설정 버튼을 클릭하여 설정할 수 있습니다. 6. 소리 알림이나 진동 알림을 선택할 수 있으며, 모두 설정할 수 있습니다.

WeChat 빨간 봉투 알림음을 어떻게 설정하나요? WeChat 빨간 봉투 프롬프트 사운드 설정 방법 WeChat 빨간 봉투 알림음을 어떻게 설정하나요? WeChat 빨간 봉투 프롬프트 사운드 설정 방법 Mar 13, 2024 am 11:30 AM

기능이 풍부한 소셜 애플리케이션인 WeChat은 사람들에게 편리한 의사소통 방법을 제공할 뿐만 아니라 독특한 빨간 봉투 기능을 통해 더 많은 재미를 더해줍니다. WeChat 빨간 봉투 알림 소리를 설정하면 사용자는 빨간 봉투를 받았을 때 즉시 알 수 있어 기대감과 놀라움이 더해집니다. WeChat 빨간 봉투 프롬프트 사운드 설정은 빨간 봉투를 받을 때마다 기대감과 즐거움이 가득합니다. WeChat 빨간 봉투 알림음 설정 방법은 주로 휴대폰 시스템과 WeChat 버전에 따라 다릅니다. Android 및 Apple 시스템의 설정 단계를 살펴보겠습니다. WeChat 빨간 봉투 알림음을 어떻게 설정하나요? WeChat 빨간 봉투 프롬프트 사운드 설정 방법 1. Android 시스템의 경우 1. WeChat 애플리케이션을 열고 하단 탐색 표시줄에서 [나] 옵션을 클릭한 후 [나] 페이지로 이동한 후 [설정]을 클릭합니다. 2. 설정 페이지에서

WeChat 빨간 봉투를 상대방에게 반환하라는 메시지에 대한 자세한 설명 WeChat 빨간 봉투를 상대방에게 반환하라는 메시지에 대한 자세한 설명 Mar 25, 2024 pm 05:51 PM

1. 먼저 WeChat을 열고 검색 상자를 클릭합니다. 2. 위챗페이를 검색하세요. 3. 클릭해서 들어가세요. 4. 양 당사자 모두 여기에서 WeChat 빨간 봉투 환불 메시지를 받게 됩니다.

WeChat으로 보낼 수 있는 빨간 봉투의 최대 개수는 몇 개입니까? WeChat으로 보낼 수 있는 빨간 봉투의 최대 개수는 몇 개입니까? Aug 17, 2023 pm 01:48 PM

WeChat에서는 최대 200개의 빨간 봉투를 보낼 수 있습니다. 세부사항: 각 사용자에게 하루에 발송되는 빨간 봉투의 총액은 1,000위안을 초과할 수 없습니다. 몇 가지 제한 사항이 있지만 WeChat 빨간 봉투는 여전히 매우 편리하고 인기 있는 결제 방법입니다. 설날이나 다른 특별한 날에 WeChat 빨간 봉투는 사람들에게 더 많은 즐거움과 놀라움을 선사합니다.

See all articles