網易奪寶的規則是,用戶使用一元購買一個隨機奪寶號,當全部的奪寶號都售盡後,按照必定算法獲得中獎號碼。這裏的核心算法在於,用戶如何獲得隨機奪寶號,且能保證不衝突。 使用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的實現方式。算法