PHP-请教一个抽奖程序的算法?
奖品等级分为 A B C D E F, 预计用户数 20w
概率大概如下:
中 A 奖品的 概率为 0.01%
中 B 奖品的 概率为 5%
中 C 奖品的 概率为 8%
中 D 奖品的 概率为 10%
中 E 奖品的 概率为 15%
中 F 奖品的 概率为 57%
中不到奖的概率为 4.99%
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
申请一个10000个元素的数组,把A B C D E F按概率依次保存在数组里,概率*10000。算法如下:
char szArray[10000]={0};
void Init()
{
int num=0,i=0;
szArray[0]='A';
num++;
for(i=num;i<500+num;i++,num++)
szArray[i]='B';
for(i=num;i<800+num;i++,num++)
szArray[i]='C';
for(i=num;i<1000+num;i++,num++)
szArray[i]='D';
for(i=num;i<1500+num;i++,num++)
szArray[i]='E';
for(i=num;i<5700+num;i++,num++)
szArray[i]='F';
for(i=num;i<499+num;i++,num++)
szArray[i]='N';
}
关键是产生1-10000的随机数要均匀分布,可以采用如下的随机算法:
srand((unsigned)time(NULL));
int result = rand()%10000;
但无法保证产生1-10000是均匀分布的,因为计算机生成的是伪随机数,真正的随机要用硬件实现。
将概率都转成整数,在计算随机数,看落在哪个区间里就获得哪个奖品。
示例采用JavaScript编写(PHP代码类似):
function gift() {
var gifts = ["A", "NONE", "B", "C", "D", "E", "F"];
var rands = [1, 499, 500, 800, 1000, 1500, 5700];
var size = rands.length;
for (var i = 1; i < size; i++) {
rands[i] += rands[i - 1];//循环处理概率,划分区间
}
//alert(rands);
var rand = (Math.random() * 10000) >> 0, giftType = 1/*默认不中奖*/;
for(i = 0; i < size; i++) {
if(rand < rands[i]) {
giftType = i;
break;
}
}
return gifts[giftType];
}
alert(gift());