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样式问题
如果觉得《php整点抽奖活动 php 抽奖算法_PHP抽奖算法思路? php 抽奖算法 算法 - phpStudy》对你有帮助,请点赞、收藏,并留下你的观点哦!