【问题标题】:Randomizing array elements随机化数组元素
【发布时间】:2011-04-18 15:21:34
【问题描述】:

我有一个数组@number = [1,2,3,4,5,6,7,8,9]
现在,我想随机化数组内容...例如:[5,3,2,6,7,1,8]
请指导我如何进行。

【问题讨论】:

标签: ruby shuffle


【解决方案1】:

使用shuffle 方法...

irb(main):001:0> [1,2,3,4,5].shuffle
=> [3, 4, 2, 5, 1]

【讨论】:

    【解决方案2】:

    shuffle 命令返回一个随机版本的数组

    例如:

    [1,2,3].shuffle => [2,3,1]
    

    【讨论】:

    • 如果你想原地随机化,你可以写@number.shuffle!
    【解决方案3】:
    [1,2,3,4,5,6,7,8,9].sort_by {rand}[0,9]  
    => [5, 7, 3, 8, 9, 4, 2, 1, 6]
    

    【讨论】:

      【解决方案4】:

      如果您使用的是旧版本的 ruby​​... 这将起作用

      def randomize(array)
      b = []
      array.length.downto(1) { |n|
          b.push array.delete_at(rand(n))
      } 
      b 
      

      结束

      a = [1,2,3,4,5] b=随机化(a) 打印 b

      【讨论】:

      • 至少,他是这里唯一一个给出了没有内置函数的可行解决方案的人。
      【解决方案5】:
      loop n times
         i = random array index
         j = random array index
         swap elements i and j
      end
      

      【讨论】:

      • Random 不能保证给出正确分布的结果。因此,使用两个随机索引交换元素可能会为您提供中间未更改序列块的数组。您应该将 i 从 0 增加到 n 并随机取 j 以确保 所有 元素至少交换一次。
      • 太糟糕了。偶数和奇数n 给出了两组不同的排列。好难过,但还是有老师用这种方法教学生……千万不要那样做!
      • @Nakilon:你在说什么?为什么 n 是偶数还是奇数很重要?
      • @RyanHennig。 1.如果你给我原始的arrayn,我应该告诉你,你不能得到什么一半的排列集,你能得到什么。使用[1,2,3,4,5]n%2 == 1,你永远不会得到[5,4,3,2,1]。 2. 此外,在统计上,在理想的随机混排数组中,1 元素位于其原始(它将在有序数组中的位置)位置。您使用1mln 元素对数组进行改组至少需要7mln 交换才能在其原始 位置上使用2 元素制作数组。
      • @gaearon:没有要求确保所有元素至少交换一次。
      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 2013-11-14
      • 2019-02-21
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多