Walker's Alias Method for quickly sampling from an array
github.com
github.com
http://www.keithschwarz.com/darts-dice-coins/
And the corresponding HN discussion.
1: http://code.activestate.com/recipes/576564-walkers-alias-met...
In particular, both methods are O(1) after a precomputation step. What the Alias Method appears to get you is a significant reduction in space required.