原理是使用hash随机字符串,位数不足时用0补齐,同时把函数后出现的字母按英文字母表进行数字替换。

再根据hash出来的长度换算成对应的百分比占比,用于获取对应区间内的奖品。

该算法只适用于轮播抽奖活动,并不适用于转盘抽奖JS,转盘的抽奖需要自行修改成360°圆形区间占比即可。

  1. function random($length=16, $type=4) {
  2. switch ($type) {
  3. case 1: $str = '0123456789'; $num = 9; break;
  4. case 2: $str = 'a0sqd1fwg2hej3krl4ztx5cyv6bun7mi8o9p'; $num = 35; break;
  5. case 3: $str = 'A0SQD1FWG2HEJ3KRL4ZTX5CYV6BUN7MI8O9P'; $num = 35; break;
  6. case 4: $str = 'qAw0eSrQrtDt1yFyWuGi2oHpEaJs3dKfRgLh4jZkTlXz5xCcYvVb6nBmUN7MI8O9P'; $num = 64; break;
  7. default:
  8. return false;
  9. break;
  10. }
  11. $ret = '';
  12. for ($i=0; $i < $length; $i++) {
  13. $ret .= $str[mt_rand(0, $num)];
  14. }
  15. return $ret;
  16. }
  17. function get_hash($id){
  18. $max = 6;
  19. $str = bin2hex($id);
  20. $hash = substr($str, 0, 6);
  21. if (strlen($hash)<6){
  22. $hash = str_pad($hash, 6, "0");
  23. }
  24. $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'];
  25. $alphabet = array_flip($alphabet);
  26. for ($i=0; $i<$max; $i++) {
  27. if (is_numeric($hash{$i}) == false) {
  28. $hash{$i} = $alphabet[$hash{$i}];
  29. }
  30. }
  31. return $hash;
  32. }
  33. $rand = get_hash(random());
  34. $array = [
  35. [
  36. 'min' => '0.0001',
  37. 'max' => '0.1',
  38. 'title' => '中了只鸡',
  39. ],
  40. [
  41. 'min' => '0.1',
  42. 'max' => '1',
  43. 'title' => '吃饭了没',
  44. ],
  45. [
  46. 'min' => '1',
  47. 'max' => '20',
  48. 'title' => '三等奖',
  49. ],
  50. [
  51. 'min' => '20',
  52. 'max' => '50',
  53. 'title' => '二等奖',
  54. ],
  55. [
  56. 'min' => '50',
  57. 'max' => '100',
  58. 'title' => '别想了没一等奖',
  59. ],
  60. ];
  61. $ratio = 100 / 1000000;
  62. $num = $ratio*$rand;
  63. foreach ($array as $value) {
  64. // TM中奖了啊
  65. if ($num > $value['min'] && $num <= $value['max']) {
  66. var_dump($rand);
  67. var_dump($num);
  68. var_dump($value['title']);
  69. break;
  70. }
  71. }