PHP实现网易夺宝的算法

网易夺宝的规则是,用户使用一元购买一个随机夺宝号,当全部的夺宝号都售尽后,按照必定算法获得中奖号码。这里的核心算法在于,用户如何获得随机夺宝号,且能保证不冲突。 使用PHP能够这样实现:php

<?php 

//总需人数
$total = 5000;

//原始数,夺宝号码起始
$base_serial = 10001;

//生成5000个连续的夺宝号码
$array = range($base_serial, $base_serial + $total);

//随机获取一个夺宝号码 
echo getRandomValue($array);
echo "\n";

//随机获取一个夺宝号码 
echo getRandomValue($array);
echo "\n";

//随机获取一个夺宝号码 
echo getRandomValue($array);
echo "\n";

//随机获取一个夺宝号码 
echo getRandomValue($array);
echo "\n";

//随机获取一个夺宝号码 
echo getRandomValue($array);
echo "\n";

//随机获取夺宝号码核心算法 
function getRandomValue( & $array){
	
	//计算数组长度 
	$length = count($array);
	
	//获取不超过数组长度的随机数 
	$key = rand(0, $length-1);
	
	//得到的随机夺宝号码 
	$value = $array[$key];
	
	//将该号码删除,表示已经被占用 
	unset($array[$key]);
	
    //数组从新排序
	sort($array);
	
	//返回夺宝号码 
	return $value;
}
?>

每次经过getRandomValue()获取夺宝号后,都会将该号码删除,这样不会对后续操做有冲突。一个用户能够购买多注也没问题。操做完成后,将剩余的夺宝号存入数据库,供其余用户使用。 ####可能的问题 若是多个用户同时购买夺宝号,可能会有竞争关系,这时须要使用数据库锁定技术。 对于高并发网站,最佳方案固然是使用流行的Redis。我会在后续文章中讨论Redis的实现方式。算法

相关文章
相关标签/搜索