This is a public service announcement.
Since Wolfman++ wrote his blog post about .pick back in the year two thousand nine (nine years after the distant future), we've dropped the :replace
flag, and we've gained a .roll
method. (Actually, the change happened in September 2010, but no-one has advent blogged about it.)
So this is the new way to think about the two methods:
.pick like picking pebbles out of an urn, without putting them back
.roll like rolling a die
I don't remember how I felt about it back in 2010, but nowadays I'm all for keeping these methods separate. Also, it turns out, I use .roll($N)
a whole lot more. In that light, I'm glad it isn't spelled .pick($N, :replace)
.
Just to give a concrete example:
> say <Rock Paper Scissor>.roll
Rock # good ol' Rock
.roll
is equivalent to .roll(1)
. When we're only interested in one element, .roll
and .pick
work exactly the same since replacement doesn't enter into the picture. It's a matter of taste which one to use.
I just want to show two more tricks that .roll
knows about. One is that you can do .roll
on a Bag
:
> my $bag = (white-ball => 9, black-ball => 1).Bag;
bag(white-ball(9), black-ball)
> say $bag.roll # 90% chance I'll get white-ball...
white-ball # ...told ya
Perfect for all your weighted-randomness needs.
The other trick is that you can .roll
on an enumeration:
> enum Dwarfs <Dipsy Grumpy Happy Sleepy Snoopy Sneezy Dopey>
> Dwarfs.roll
Happy # me too!
> enum Die <⚀ ⚁ ⚂ ⚃ ⚄ ⚅>
> Die.roll
⚄
> Die.roll(2)
⚀ ⚀ # snake eyes!
> Die.roll(5).sort
⚀ ⚀ ⚁ ⚂ ⚃
The most frequent use I make of this is the idiom Bool.roll
for randomly tossing a coin in my code.
if Bool.roll {
# heads, I win
}
else {
# tails, you lose
}
Bool
is an enum by spec, even though it isn't one in Rakudo (yet) for circularity saw reasons.
> say Die.HOW
Perl6::Metamodel::EnumHOW.new()
> say Bool.HOW
Perl6::Metamodel::ClassHOW.new() # audience goes "awwww!"
This has been a public service announcement. Enjoy your holidays, and have a merry Perl 6.