我的团队正在打造一个抽奖程序,所述RNG(随机数发生器)必须是真正随机的,以便它可以由国务卿获准投放在线抽奖。

$winner = $raffle->entries()->inRandomOrder()->first();
$winning_user = $winner->user()->first();

这是怎样的代码已经实现,我只是想看看是否有人能给反馈如何"truly random"这个,或者我们应该以不同的方式来处理这个。

提前致谢!

分析解答

所述function inRandomOrderIlluminate\Database\Query\Builder类中定义像这样

/**
 * Put the query's results in random order.
 *
 * @param  string  $seed
 * @return $this
 */
public function inRandomOrder($seed = '')
{
    return $this->orderByRaw($this->grammar->compileRandom($seed));
}

所以它只是由行是compileRandom这是在Illuminate\Database\Query\Grammars\Grammar定义订单

/**
 * Compile the random statement into SQL.
 *
 * @param  string  $seed
 * @return string
 */
public function compileRandom($seed)
{
    return 'RANDOM()';
}

所以,这只是一个SQL声明LIMITED DATASET随机排序

如果$raffle->entries()->count()是1,那么它得到相同的值下一轮,如果50则1/50等等,你不能相信它不会返回相同的值(寿不太可能的巨大数据集)的1/1(100%)的概率机会

例如

App\User::inRandomOrder()->toSql();

只会导致

select * from `users` order by RAND()

因此,它不是真正达到Laravel,它给了SQL引擎你使用(MySQL或Postgres的...等)

对于MySQL这里就是他们说

RAND() is not meant to be a perfect random generator. It is a fast way to generate random numbers on demand that is portable between platforms for the same MySQL version.

所以,你不能相信它是真正随机的

如果你想复制可能性低一个真正的随机数或string,我会建议您尝试的md5甚至更好bcrypt hash

希望这可以帮助