【发布时间】:2014-12-26 06:56:25
【问题描述】:
我有一个非常简单的应用程序,它需要(尽可能公平地)随机将一个人分配给一个团队。
目前,我正在使用几种不同的方法进行迭代。
Team.where(assigned: false).order("RANDOM()").first
以及将其加载到数组中并使用 sample()
arr.sample().inspect
但是,这些似乎并不是真正随机的,它们通常会保留边缘 (1,2..8,9,其中 count = 10) 直到最后。有没有更好的方法涉及或不涉及 AR? PSQL rand 和 sqlite3 random() 之间在数学上是否存在明显差异?
感谢任何有关生成所述随机分布的循环的帮助!
【问题讨论】:
-
样本对我来说一直很公平——你有没有试过这样做几十万次并计算每个对象被挑选了多少次?
-
@williamthomas 您可以使用偏移量来选择随机值检查此链接:stackoverflow.com/questions/2752231/…
-
是的,它“看起来”很好,比直接从 db 好得多。不确定缓存是否对其有任何影响。
-
人类往往无法检测到真正的随机性。虽然计算机随机算法是所谓的伪随机算法,但人们通常会将“随机”与“均匀分布”(即使在非常局部的范围内)混为一谈。也就是说,如果您掷硬币 100 次,那么在几个序列中您连续 5 次正面或反面是完全合理的。实际上没有这样的序列强烈表明序列不是真正随机的。我从来没有遇到过 rand() 的问题,但出于安全考虑,我确实使用 SecureRandom(更好)或 bcrypt(可能最适合密码)。
标签: ruby-on-rails ruby random