From: Matthew Moss Date: 2006-03-18T02:36:24+09:00 Subject: Re: Card tricks with Ruby 2 - The Riffle > How would you code riffle? Start with a merge sort: def merge(left, right, &pred) if right.empty? left.dup elsif left.empty? right.dup elsif pred.call(left.first, right.first) [left.first] + merge(left[1..-1], right, &pred) else [right.first] + merge(left, right[1..-1], &pred) end end And then riffle! def riffle(deck) n = deck.size / 2 left, right = deck[0...n], deck[n..-1] merge(left, right) { rand < 0.5 } end Or, to simulate one side's cards being more likely given the other side's card just went down: def riffle(deck) n = deck.size / 2 left, right = deck[0...n], deck[n..-1] p = 0.5 merge(left, right) do res = (rand < p) p = res ? p*p : Math.sqrt(p) res end end