网易夺宝的规则是,用户使用一元购买一个随机夺宝号,当全部的夺宝号都售尽后,按照必定算法获得中奖号码。这里的核心算法在于,用户如何获得随机夺宝号,且能保证不冲突。 使用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的实现方式。算法