设计一个抽奖活动,1000份奖品,每一千人中有一个领取,这个怎么设计?代码思路都可以

今天看到这样的题:设计一个抽奖活动,1000份奖品,每一千人中有一个领取,这个怎么设计?代码思路都可以(最优考虑并发)

 select top 1000 from 用户表 order by newid()
$res = [];
    for($num=0;$num<1000;$num++)
    {
        $dsn = "mysql:host=localhost;dbname=test;";
        $user = 'root';
        $pass ='wasd';
        $PDO = new PDO($dsn,$user,$pass);
        $n = rand($num*1000,$num+1000);
        $sql = "SELECT id FROM id WHERE id=$n";
        $pdo_statement = $PDO->query($sql);
        $res[] = $pdo_statement->fetch(PDO::FETCH_ASSOC);
    }
    var_dump($res);

代码大概这样吧,没有数据,就是跟分页的原理类似,MYSQL的rand函数随机一下num到其后1000,这样就可以达到随机的效果了吧,可是循环有些卡,
有没有人能优化一下。

php代码我不懂,我给你理一理逻辑。没搞懂你的意思,是需要一千个人必有一个中奖还是千分之一的概率。
那我暂时分2种看,
第一种,千分之一概率,这个简单,一千个人请求,服务器直接随机数。随机数1-1000,假如设1为中奖,抽中1者就是中奖者。
第二种,一千人小团体中,一人中奖,这个分2种情况,划分请求,1000次请求抽一次,这个人中奖,看你服务器的请求量了。这个需要很多人请求的情况还需要等待1000次请求才能开奖。
第二种情况的第二种方法,
1000个人请求,随机,跟第一种一样,先是千分之一概率,如果前面999人都没中奖,那第1000个人中奖,如果中奖了,后面到第1000次请求都无法中奖。
你可能觉得那可能第1000次请求中奖概率比较大,那你可以调整比例。百分之1概率。谁先抽中谁赢。2333你自己琢磨一下比例就行。
我个人意见,你觉得行就行。

给定一个中奖号如990,然后每一个抽奖人随机获取1到1000的随机数,如果要求1000人必有一人中奖,那么请将抽奖人的随机数存入数据库,每次抽奖前判断一下,抽奖人的随机数是不是已经存在了,存在了就重新获取

生成一个只有(数组/列表)含有999个0,然后随机位置插入一个1,每获得一个数就pop出去。如果愿意,pop完可以在打乱一次数组或列表,但这样取只能固定位置取,要么取第一个,要么取最后一个。

redis 队列。用户和奖品放在队列里进行抽选。并发不会出现多送奖品。