<?php
set_time_limit(5);class Prise
{
public $winnerList; # 得奖者名单
public $rankList; # 分等次的名单
/**
     * 获取某范围内不重复的随机值列 获取得奖者
     *
     * @param integer $min        最小值
     * @param integer $max     最大值
     * @param integer $n           数量
     * @return array -> integer    返回随机数字组成的数组
     */
public function getWinner($min,$max,$n)
{
$returnNum = array();
$numCount = null;
settype($min,'integer');
settype($max,'integer');
settype($n,'integer');
$isBreak = false;
do
{
$returnNum[] = mt_rand($min,$max);    # 推入随机数
$numCount = count($returnNum);    # 计算数组单元数目
if ($numCount == $n)
{
$returnNum = array_unique($returnNum);    # 清理相同值
$numCount = count($returnNum);    # 重新计算单元数目
if ($numCount == $n)
{
$isBreak = true;    # 跳出
}
}
}while (!$isBreak) ;
sort($returnNum);    # 排序(自然)
shuffle($returnNum); # 打乱排序
$this->winner = $returnNum;
return $returnNum;
}
/**
 * 获取有等级的名单
 *
 * @param integer $min
 * @param integer $max 
 * @param array $rank #获奖等次设置
 */
public function getRank($min,$max,$rank)
{
$rankList = array();
$n = array_sum($rank);
$winnerList = $this->getWinner($min,$max,$n); settype($rank,'array');
$begin = 0;
foreach ($rank as $key => $value)
{
$rankList[$key] = array_slice($winnerList,$begin,$value);
sort($rankList[$key]);
$begin += $value;
} $this->winnerList = $winnerList;
$this->rankList = $rankList;
return $rankList;
}
}
$price = new Prise();
$rank = array('Rank 1'=>1,'Rank 2'=>3,'Rank 3'=>5,'Rank 4'=>10,'Rank 5'=>15);
#等级设置的小了点,以免显示不下输出.
$price->getRank(1,500,$rank);
print_r($price->rankList);
# 输出
//Array
//(
//    [Rank 1] => Array
//        (
//            [0] => 70
//        )
//    [Rank 2] => Array
//        (
//            [0] => 112
//            [1] => 208
//            [2] => 494
//        )
//    [Rank 3] => Array
//        (
//            [0] => 185
//            [1] => 229
//            [2] => 423
//            [3] => 451
//            [4] => 461
//        )
//    [Rank 4] => Array
//        (
//            [0] => 5
//            [1] => 26
//            [2] => 39
//            [3] => 62
//            [4] => 90
//            [5] => 101
//            [6] => 157
//            [7] => 254
//            [8] => 259
//            [9] => 482
//        )
//    [Rank 5] => Array
//        (
//            [0] => 137
//            [1] => 158
//            [2] => 172
//            [3] => 184
//            [4] => 195
//            [5] => 204
//            [6] => 236
//            [7] => 260
//            [8] => 272
//            [9] => 277
//            [10] => 321
//            [11] => 358
//            [12] => 390
//            [13] => 396
//            [14] => 479
//        )
//)
?>

解决方案 »

  1.   

    select * from award order by rand() limit 1 //随机取出一个中奖奖的select * from award  order by rand() limit 3 //随机取出一个中奖奖的select * from award  order by rand() limit 6 //随机取出一个中奖奖的select * from award  order by rand() limit 15 //随机取出一个中奖奖的select * from award  order by rand() limit 100 //随机取出一个中奖奖的不过要加个是否中奖的状态字段,把取出过的记录状态要变一下,这样就不会一个人中两次奖,我的办法很笨,楼上的正解,共同学习
      

  2.   

    $last=array_rand($500个人的编号数组,获奖总人数);
    然后可以从$last数组中按顺序获奖,这就随便你了。
      

  3.   

    我上个月刚刚做了一个700人抽奖的,用的是PHP+MYSQL随机取出数据,然后用PHP写出JS代码来抽奖,效果还可以,就是要防止用户操作过快,数据库连接建议使用pconnect()