On Nov 26, 7:17 pm, rbysam... / gmail.com wrote:
> Are there any more elegant, concise, pithy, and more Rubyish ways of
> doing this?
>
> def roll(number_of_dice)
>     sum = 0
>     number_of_dice.times do
>         sum += rand(5).next
>     end
>     sum
> end
>
> Thanks in advance!

As others have pointed out, you need rand(6).next to get (1..6);
otherwise, it's hard to improve on what you have here. This is a
simple, iterative mathematical function. I personally don't think
using map, inject, etc. is more "Rubyish" in this context, just 2 to 3
times slower.

The interface is "roll n" regardless of the underlying implementation,
so you might as well make it fast.

One style improvement might be to use a one line block:

def roll num_dice
  sum = 0
  num_dice.times { sum += rand(6).next }
  sum
end

You can make it ~10% faster (with the loss of some readability) by not
invoking next each time and just summing at the end:

def roll num_dice
  sum = 0
  num_dice.times { sum += rand(6) }
  sum + num_dice
end


Brian Adkins