Products
GG网络技术分享 2025-03-18 16:17 0
原理是使用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;
}
}Demand feedback