4

我需要做的事情非常简单,所以我不需要创建一个复杂的程序,我只需要使用一次,将其结果作为我现在正在工作的真实项目的提要数据。

我需要获得一组 N 个元素的 50 个第一个(或者,更好的是 50 个随机数)组合,从 2 到 50 的每个值都是 N。

在 Ruby 中,从逻辑上讲,将类似于

require 'pp'

pp (1..50).to_a.permutation.to_a.first(50)

但遗憾的是,这些程序总是内存不足。事实上,我可以在我的机器上生成的“最大”数字是 10,我需要 50。

我很确定存在其他更有效的方法来实现这一点,但因为我不太了解所涉及的数学,我需要拼命寻求你的帮助。你们中的任何人都知道一些 gem、库,甚至是一种算法,它们以一种不消耗所有内存的方式来做到这一点。慢一点没关系,就像我说的,我只需要生成一次这个东西。

4

3 回答 3

3

使用#takeEnumerable 的方法:

pp (1..50).to_a.permutation.take(50)
于 2013-01-13T20:51:38.553 回答
3

不要调用to_a排列枚举器,只需将其用作枚举器即可:

(1..50).to_a.permutation.first(50)

但是如果你想要随机排列,你可以将数组洗牌 50 次:

ar = (1..50).to_a
Array.new(50){ar.shuffle}
于 2013-01-13T21:31:11.793 回答
0

我认为您将不得不一次迭代并生成一个数组,以防止出现内存问题。例如

1.upto(50) do |i|
  store permutions_for i
end

def permutions_for(size)
  #get permutions for the given size
end

def store(arr)
  # print, save to db, whatever, just don't keep it in memory :)
end
于 2013-01-13T20:44:54.797 回答