【问题标题】:Active Record true random? [duplicate]Active Record 真随机? [复制]
【发布时间】: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


【解决方案1】:

尽管可能有更多方法可以生成随机数来选择记录(即使是极端措施,如random.org),但您提供的随机选择应该证明是绰绰有余的,它们之间几乎没有差异。

如果我是你,我会意识到两者之间的开销差异;一个应该从数据库中只选择一条记录,另一个将所有记录拉入内存并随机选择一条。如果 Team 表变大,这可能会导致内存和计算消耗,从而减慢整个计算。第二种方法只有在我还需要内存中的整个表用于其他目的时才会使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多