我需要做的事情非常简单,所以我不需要创建一个复杂的程序,我只需要使用一次,结果是我现在正在工作的真实项目的feed数据
我需要获得一组N个元素的50个第一(或更好,50个randoms)组合,每个值从2到50为N.
在Ruby中,从逻辑上讲,将类似于
require 'pp'
pp (1..50).to_a.permutation.to_a.first(50)
但遗憾的是,这些程序总是内存不足。事实上,我在机器上生成的“最大”数字是10,我需要50。
我很确定存在一些其他更有效的方法来实现这一点,但由于我不太了解所涉及的数学,我需要拼命地请求你的帮助。你们中的任何人都知道某些宝石,库,甚至是以不消耗所有内存的方式执行此操作的算法。如果速度慢,就像我说的那样,我只需要生成一次。
答案 0 :(得分:3)
使用Enumerable的#take
方法:
pp (1..50).to_a.permutation.take(50)
答案 1 :(得分:2)
不要在排列枚举器上调用to_a
,只需将其用作枚举器:
(1..50).to_a.permutation.first(50)
但是如果你想要随机排列,你可以将数组洗牌50次:
ar = (1..50).to_a
Array.new(50){ar.shuffle}
答案 2 :(得分:0)
我认为您将不得不一次迭代并生成一个数组以防止内存问题。 e.g。
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