php做一个抽奖小案例 理解抽奖算法的实现

<?php

	// 准备奖品
	// weight代表奖品权重  权重越大被抽到的可能性也就越大
	// 可以在后台进行设置
	// 如果不希望该奖品被抽到  权重可以给设置成0
	$rewardOptions = array(
		array('id' => 1, 'name' => '橙武', 'weight' => 1), 
		array('id' => 2, 'name' => '紫武', 'weight' => 1), 
		array('id' => 3, 'name' => '蓝武', 'weight' => 1), 
		array('id' => 4, 'name' => '绿武', 'weight' => 1), 
		array('id' => 5, 'name' => '白武', 'weight' => 1), 
	);

	// 获取抽到的奖品ID
	$rewardId = getRewardId($rewardOptions);
	// 得到奖品ID  进行相关业务操作
	// .....
	// 展示对应的奖品
	echo $rewardOptions[$rewardId - 1]['name'];


	/**
	 * [getRewardId 抽奖方法(必定能抽中奖品)]
	 * 这个算法的核心点就在于看获得的随机数是否落在某个权重范围区间
	 * 如果是则直接可以取出该奖品
	 * 如果不是则将总权重中去除本次循环的权重
	 * 总权重一次一次减小  最后一个总权重  必定等于最后一次循环的奖品权重
	 * 所以获得的随机数必定也在这个范围内 奖品必然会获得
	 * @param  [type] $arr [奖品数组]
	 * @param  [type] $start [起始权重 可用来做猫腻 
	 * 如果只想让廉价的奖品被抽中 可以将该值设置为廉价商品的权重值]
	 * @return [type] $id  [抽到的奖品]
	 */
	function getRewardId($arr, $start = 1) {
		// 计算总权重
		$totalWeight = array_sum(array_column($arr, 'weight'));
		
		foreach($arr as $k => $v) {
			// 获取一个总权重内的随机数
			$random = mt_rand($start, $totalWeight);
			if($random <= $v['weight']) {
				return $v['id'];
			} else {
				$totalWeight -= $v['weight'];
			}
		}
	}

####代码果然需要理解记忆 死记硬背是永远消化不了的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值