0
点赞
收藏
分享

微信扫一扫

php 实现抽奖功能

绪风 2023-03-24 阅读 47


阅读目录

  • 抽奖功能 1
  • 抽奖功能 2

抽奖功能 1

最近做的小程序有一个抽奖功能,这里记录下实现抽奖功能的具体流程

前提:

有一组奖品数据如下

id

奖品(prize)

概率(rate)

数量(num)

已抽数量(prize_num)

1

一等奖

10%

10

0

2

二等奖

15%

20

0

3

三等奖

35%

50

0

根据如上实现抽奖如下($prizes表示上面表格数据)

public function promise()
	{
		$prizes = [
			[
				'id' => 1,
				'prize' => '一等奖',
				'rate' => '0.1',
				'num' => '10',
				'prize_num' => '0',
			],
			[
				'id' => 2,
				'prize' => '二等奖',
				'rate' => '0.15',
				'num' => '20',
				'prize_num' => '0',
			],
			[
				'id' => 3,
				'prize' => '三等奖',
				'rate' => '0.3',
				'num' => '50',
				'prize_num' => '0',
			],
		];
		//进行抽奖
		$data = [];
		foreach ($prizes as $prize) {
		    if (($prize['num'] - $prize['prize_num']) > 0) {
		        $data[$prize['id']] = 100 * ($prize['rate']);
		    }
		};
		//获取所有奖品的总概率
		$sum = array_sum($data);
		$countSum = 100;
		if ($sum < $countSum) {
		    $data[0] = $countSum - $sum;//不满100%,表示没有抽取到奖品
		}
		$result = 0;
		//概率数组总精度
		//概率数组循环
		foreach ($data as $key => $value) {
		    $randNum = mt_rand(1, $countSum);
		    if ($randNum <= $value) {
		        $result = $key;
		        break;
		    } else {
		        $countSum -= $value;
		    }
		}
		unset($arr);
		echo $result;//抽到的ID值,0表示没有抽到奖品

	}

根据如上就可以实现抽奖功能

php 实现抽奖功能_数组

抽奖功能 2

<?php

function gl()
{
    $prize_arr = [
        '0' => ['id' => 1, 'prize' => '奖品1', 'v' => 20],
        '1' => ['id' => 2, 'prize' => '奖品2', 'v' => 10],
        '2' => ['id' => 3, 'prize' => '奖品3', 'v' => 20],
        '3' => ['id' => 4, 'prize' => '奖品4', 'v' => 5],
        '4' => ['id' => 5, 'prize' => '奖品5', 'v' => 19],
        '5' => ['id' => 6, 'prize' => '奖品6', 'v' => 5],
        '6' => ['id' => 7, 'prize' => '奖品7', 'v' => 10],
        '7' => ['id' => 8, 'prize' => '奖品8', 'v' => 10],
    ];

    foreach ($prize_arr as $key => $val)
    {
        $arr[$val['id']] = $val['v'];
    }

    $rid = get_prize($arr); //根据概率获取奖项id
    $data = $prize_arr[$rid - 1];
    return $data;
}

function get_prize($proArr) 
{
    $result = '';

    //概率数组的总概率精度
    $proSum = array_sum($proArr);

    //概率数组循环
    foreach ($proArr as $key => $proCur)
    {
        $randNum = mt_rand(1, $proSum);
        if ($randNum <= $proCur)
        {
            $result = $key;
            break;
        } else {
            $proSum -= $proCur;
        }
    }
    unset ($proArr);
    return $result;
}

print_r(gl());

php 实现抽奖功能_php_02


举报

相关推荐

0 条评论