php整点抽奖活动,php,抽奖算法_PHP抽奖算法思路?,php,抽奖算法,算法 - phpStudy

PHP抽奖算法思路?

网上有个烂大街的算法,具体请看链接

大概原理是:

1,生成一个随机数;

2,循环对比第N个奖品的概率;

3,确定奖品;

如果按照这个算法,主观上是抽一次奖,但客观上,把每个奖品都循环抽了一遍,其实是抽了N次,不知道我的理解对不对。

下面是我写的算法,具体原理是:

1,先确定随机数(幸运号码)的范围;

2,确定每个奖品的号码区间,确保只抽一次奖能对应到某个奖品;

3,根据范围生成一个幸运号码;

4,根据范围确定奖品;

请教各路大神,有没有更优的算法或思路?

$goods = [

0 => [

'id' => 1,

'name' => '苹果电脑',

'odds' => '0.01' //概率

],

1 => [

'id' => 2,

'name' => 'Iphone',

'odds' => '10.99'

],

2 => [

'id' => 3,

'name' => '200元红包',

'odds' => '19'

],

3 => [

'id' => 4,

'name' => '安慰奖',

'odds' => '30'

],

4 => [

'id' => 5,

'name' => '什么都没抽到',

'odds' => '40'

],

];

$baseOdds = 100; //抽奖概率基数,默认100%

$maxBase = 1; //抽奖概率基数倍数,默认1,如果奖品概率有小数位,该倍数为10的小数位数平方,具体看下面

foreach ($goods as $good) {

$decimal = strpbrk($good['odds'], '.'); //获取小数点后面的内容

if ($decimal !== false) {

$decimalCount = strlen($decimal) - 1;//获取小数点后面的位数

$newMaxBase = pow(10, $decimalCount); //例如概率如果是0.01,则全局的抽奖概率基数需要以10的平方倍数上涨

if ($newMaxBase > $maxBase) {

$maxBase = $newMaxBase; //更新基数倍数

}

}

}

$baseOdds = $maxBase ? $baseOdds * $maxBase : $baseOdds; //更新概率基数

$start = 1;

$end = 0;

$luckyCompare = $tickets = [];

//为每个奖品生成一个幸运数区间

foreach ($goods as $key => $good) {

$newOdds = $good['odds'] * $maxBase;

$end = $end + $newOdds;

$luckyCompare[$good['id']] = [$start, $end];

$tick = mt_rand($start, $end);

$start = $start + $newOdds;

$tickets[$good['id']] = $tick;

}

$luckyNumber = mt_rand(1, $baseOdds);

var_dump($luckyNumber);

var_dump($luckyCompare);

foreach ($luckyCompare as $goodId => $compare) {

if ($compare[0] <= $luckyNumber && $compare[1] >= $luckyNumber) {

$luckyGood = $goodId; //最终的奖品

break;

}

}

var_dump($luckyGood);

相关阅读:

一道前端面试题,如何通过备用IP提高页面的访问成功概率?

Laravel 5.0 url与目录的关系?

假设想记录用户一个月内的积分历史,MySQL建表该怎么建呢

flask怎么给一个类统一的url前缀

centos6.6 安装vscode报错 求解决

如何在单个web页面内建立多个静态文件作用域?

sqlalchemy如何较好的操作一个已经存在的数据库?

Nginx or php-fpm代码文件缓存

我们线上服务器有几十万用户了,现在迁移数据库到另一台服务器,怎么快速迁移,最好无缝迁移。

页面莫名其妙请求错误资源undefined

thinkphp里面不用smarty怎样遍历?

ios 怎么储存webview

画网络拓扑图免费开源的支持自动布局的js

node初学, windows下database推荐

系统API中有类似于FloatingActionsMenu控件吗?

有么有好的办法禁止浏览器将pdf另存为,或是打印的

移动浏览器上该怎么调试页面?

网站后台权限设计

android studio 创建新的文件弹出的窗口太大,看不到下面的按钮

echarts的tooltip样式问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值