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的實現方式。算法

相關文章
相關標籤/搜索