Задача: взять список или массив и выбрать один случайный элемент.
Это решается крайне просто: в Perl 6 определены методы pick и roll, которые выберут и вернут случайный элемент:
my @a = 'a' .. 'z'; say @a.pick; # b say @a.roll; # u
Усложняем задачу: выбрать несколько случайных элементов.
При выборе одного элемента разницы между двумя методами нет. Она проявляется, когда вы добавляете целочисленный аргумент — в этом случае методы возвращают несколько значений:
my @a = 'a' .. 'z'; say @a.pick(5); # (b i c x v) say @a.roll(5); # (c k m c f)
Уже на этом случайном результате видно, что roll вернул повторяющиеся элементы. Именно так и есть: pick заботится об уникальности возвращаемых данных, а roll — нет.
Из этого свойства вытекает важное ограничение: если запрошенный список длиннее оригинального, то метод pick вернет меньше запрошенного — возвращаемый список будет случайно пересортированным оригинальным.
my @b = 'a' .. 'd'; say @b.pick(10); # (c a b d) say @b.roll(10); # (a c a c c a b a b b)
Обе рутины (routine) существуют и как отдельные функции, первый аргумент которых указывает число нужных случайных элементов:
my @a = 'a' .. 'z'; say pick(3, @a); # (g v d) say roll(3, @a); # (j w r)