4

2つのアレイをランダムな場所に圧縮して元の順序を維持する簡単な方法はありますか?

例えば

a=[0,1,2,3,4,5,6,7,8,9,10]


b=["one","two","three","four"]

と0から5までの乱数rand(5)

zipped = [0,"one",1,2,3,"two",4,"three",5,6,7,8,"four",9,10]

ランダムな系列は1,3,1,4、bの各要素をaに「zip」する場所として使用されます。

私にできる最善のことは

i=0
merged=a
b.each do |x|
rnd = rand(5)
merged.insert(i+rnd,x)
i=i+rnd
end
4

2 に答える 2

4

このバージョンでは、アレイの両端にバイアスがかからない、バランスの取れたシャッフルが可能になります。

def ordered_random_merge(a,b)
  a, b = a.dup, b.dup
  a.map{rand(b.size+1)}.sort.reverse.each do |index|
    b.insert(index, a.pop)
  end
  b
end
于 2013-01-17T11:24:31.770 に答える
0

これは、より機能的なスタイルでのMarkHubbartのアプローチの変形です。

MergeTuple = Struct.new:place、:value

def ordered_random_merge( merge_to, merge_from )
  merge_from.
  map { |e| MergeTuple[ rand( merge_to.size+1 ), e ] }.
  sort_by { |mt| - mt.place }.
  each_with_object( merge_to.dup ) { |mt, merged| merged.insert(mt.place, mt.value) }
end
于 2013-01-17T16:39:38.983 に答える