From: Robert Klemme Date: 2009-07-27T18:25:05+09:00 Subject: Re: Pseudo random On 27.07.2009 09:32, Kless wrote: > For if this can help to somebody, I use a deck of 52 cards to get a > better randomness. Although it could be used a deck of: number to > return * 2 (or 3) > > ----------------------- > def bytes(n=nil) > # The range of possible values to each card is 256 (0-255), the > # maximum length to representing an ASCII character. > > # By default returns 16 bytes (128 bits), a common value in salts > and IVs. > n ||= 16 > > # Gets 52 cards with values in range 0-255, and then they are > shuffled. > cards = (1..52).map { rand(256) }.shuffle > > # Finally gets 'n' cards from the deck, and it is encoded to ASCII. > (1..n).map { cards[rand(52)] }.pack("C*") > end > ----------------------- My pseudo randomness math is a bit rusty these days but it may be that you do not increase randomness by using your approach as you still use only one source of randomness. If this is the case, the same can be achieved by doing def bytes(n = 16) b = "" n.times { b << rand(256) } b end or with 1.9 def bytes(n = 16) "".tap do |b| n.times { b << rand(256) } end end Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/