PHP-请教一个抽奖程序的算法?

PHP-请教一个抽奖程序的算法?

浮生未歇 发布于 2016-10-24 字数 263 浏览 1310 回复 2

奖品等级分为 A B C D E F, 预计用户数 20w
概率大概如下:
中 A 奖品的 概率为 0.01%
中 B 奖品的 概率为 5%
中 C 奖品的 概率为 8%
中 D 奖品的 概率为 10%
中 E 奖品的 概率为 15%
中 F 奖品的 概率为 57%
中不到奖的概率为 4.99%

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

偏爱自由 2017-02-28 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是均匀分布的,因为计算机生成的是伪随机数,真正的随机要用硬件实现。

夜无邪 2016-11-17 1 楼

将概率都转成整数,在计算随机数,看落在哪个区间里就获得哪个奖品。

示例采用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());