我的团队正在打造一个抽奖程序,所述RNG(随机数发生器)必须是真正随机的,以便它可以由国务卿获准投放在线抽奖。
$winner = $raffle->entries()->inRandomOrder()->first();
$winning_user = $winner->user()->first();
这是怎样的代码已经实现,我只是想看看是否有人能给反馈如何"truly random"这个,或者我们应该以不同的方式来处理这个。
提前致谢!
分析解答
所述function inRandomOrder
在Illuminate\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
希望这可以帮助