原理是使用hash随机字符串,位数不足时用0补齐,同时把函数后出现的字母按英文字母表进行数字替换。
再根据hash出来的长度换算成对应的百分比占比,用于获取对应区间内的奖品。
该算法只适用于轮播抽奖活动,并不适用于转盘抽奖JS,转盘的抽奖需要自行修改成360°圆形区间占比即可。
function random($length=16, $type=4) {
switch ($type) {
case 1: $str = '0123456789'; $num = 9; break;
case 2: $str = 'a0sqd1fwg2hej3krl4ztx5cyv6bun7mi8o9p'; $num = 35; break;
case 3: $str = 'A0SQD1FWG2HEJ3KRL4ZTX5CYV6BUN7MI8O9P'; $num = 35; break;
case 4: $str = 'qAw0eSrQrtDt1yFyWuGi2oHpEaJs3dKfRgLh4jZkTlXz5xCcYvVb6nBmUN7MI8O9P'; $num = 64; break;
default:
return false;
break;
}
$ret = '';
for ($i=0; $i < $length; $i++) {
$ret .= $str[mt_rand(0, $num)];
}
return $ret;
}
function get_hash($id){
$max = 6;
$str = bin2hex($id);
$hash = substr($str, 0, 6);
if (strlen($hash)<6){
$hash = str_pad($hash, 6, "0");
}
$alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
$alphabet = array_flip($alphabet);
for ($i=0; $i<$max; $i++) {
if (is_numeric($hash{$i}) == false) {
$hash{$i} = $alphabet[$hash{$i}];
}
}
return $hash;
}
$rand = get_hash(random());
$array = [
[
'min' => '0.0001',
'max' => '0.1',
'title' => '中了只鸡',
],
[
'min' => '0.1',
'max' => '1',
'title' => '吃饭了没',
],
[
'min' => '1',
'max' => '20',
'title' => '三等奖',
],
[
'min' => '20',
'max' => '50',
'title' => '二等奖',
],
[
'min' => '50',
'max' => '100',
'title' => '别想了没一等奖',
],
];
$ratio = 100 / 1000000;
$num = $ratio*$rand;
foreach ($array as $value) {
// TM中奖了啊
if ($num > $value['min'] && $num <= $value['max']) {
var_dump($rand);
var_dump($num);
var_dump($value['title']);
break;
}
}