【问题标题】:Ruby - return an array in random orderRuby - 以随机顺序返回一个数组
【发布时间】:2011-03-28 23:22:54
【问题描述】:

在 Ruby 中以随机顺序返回数组的最简单方法是什么? 任何可以在 IRB 会话中使用的又好又短的东西,比如

[1,2,3,4,5].random()
# or 
random_sort([1,2,3,4,5])

【问题讨论】:

    标签: ruby random irb shuffle


    【解决方案1】:

    array.shuffle

    【讨论】:

    • 它似乎在 1.8.7 中的 Array 中,但不是 1.8.6 或更早版本。 [1,2,3,4,5].shuffle 在 1.8.7 中对我来说效果很好。
    • 在 1.8.6 中,您可以从 backports 获得 shuffle 或仅使用 .sort_by {rand}(如果您可以接受 O(n log n) 的事实)。
    【解决方案2】:

    如果您没有 [].shuffle,则 [].sort_by{rand} 会按照 sepp2k 的说明工作。 .sort_by 将每个元素临时替换为某个用于排序的元素,在本例中为随机数。

    [].sort{rand-0.5} 但是,不会正确洗牌。如果您对数组进行随机排序,则某些语言(例如某些 Javascript 实现)无法正确地对数组进行随机排序,有时会产生相当公开的后果。

    JS 分析(附图表!):http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html

    Ruby 也不例外!它有同样的问题。 :)

    #sort a bunch of small arrays by rand-0.5
    a=[]
    100000.times{a <<  [0,1,2,3,4].sort{rand-0.5}}
    
    #count how many times each number occurs in each position
    b=[]
    a.each do |x|
        x.each_index do |i|
            b[i] ||=[]
            b[i][x[i]] ||= 0
            b[i][x[i]] += 1
        end
    end
    p b
    

    =>

    [[22336, 18872, 14814, 21645, 22333],
     [17827, 25005, 20418, 18932, 17818],
     [19665, 15726, 29575, 15522, 19512],
     [18075, 18785, 20283, 24931, 17926],
     [22097, 21612, 14910, 18970, 22411]]
    

    每个元素应该在每个位置出现大约 20000 次。 [].sort_by(rand) 给出了更好的结果。

    #sort with elements first mapped to random numbers
    a=[]
    100000.times{a <<  [0,1,2,3,4].sort_by{rand}}
    
    #count how many times each number occurs in each position
    ...
    

    =>

    [[19913, 20074, 20148, 19974, 19891],
     [19975, 19918, 20024, 20030, 20053],
     [20028, 20061, 19914, 20088, 19909],
     [20099, 19882, 19871, 19965, 20183],
     [19985, 20065, 20043, 19943, 19964]]
    

    对于 [].shuffle 类似(这可能是最快的)

    [[20011, 19881, 20222, 19961, 19925],
     [19966, 20199, 20015, 19880, 19940],
     [20062, 19894, 20065, 19965, 20014],
     [19970, 20064, 19851, 20043, 20072],
     [19991, 19962, 19847, 20151, 20049]]
    

    【讨论】:

      【解决方案3】:

      这个怎么样?

      Enumerable、Array、Hash 和 String 的辅助方法 让你选择一个随机项目或打乱项目的顺序。

      http://raa.ruby-lang.org/project/rand/

      【讨论】:

        猜你喜欢
        • 2014-09-15
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 2010-11-10
        • 2017-12-07
        • 1970-01-01
        • 2012-11-19
        相关资源
        最近更新 更多