Pick random element
How does one pick a random element from a list?
Haskell
Creating a custom function:
<lang haskell>import Random (randomRIO)
pick :: [a] -> IO a pick xs = randomRIO (0, length xs - 1) >>= return . (xs !!)
x <- pick [1 2 3]</lang>
Using the random-extras library:
<lang haskell>import Data.Random import Data.Random.Source.DevRandom import Data.Random.Extras
x <- runRVar (choice [1 2 3]) DevRandom</lang>
Icon and Unicon
The unary operator '?' selects a random element from its argument which may be a string, list, table, or set.
<lang Icon>procedure main()
L := [1,2,3] # a list x := ?L # random element
end</lang>
Java
<lang java>import java.util.Random; ... int[] array = {1,2,3}; return array[new Random().nextInt(array.length)]; // if done multiple times, the Random object should be re-used</lang>
For a List object rather than an array, substitute list.get(...)
for array[...]
. If preserving the order of the List isn't important, you could call Collections.shuffle(list);
and then list.get(0);
. You would need to shuffle each time unless you remove
d the item from the list.
JavaScript
<lang javascript>var array = [1,2,3]; return array[Math.floor(Math.random() * array.length)];</lang>
OCaml
<lang ocaml>let list_rand lst =
let len = List.length lst in List.nth lst (Random.int len)</lang>
# list_rand [1;2;3;4;5] ;; - : int = 3
PHP
<lang php>$arr = array('foo', 'bar', 'baz'); $x = $arr[array_rand($arr)];</lang>
Perl 6
Perl 6 has two functions to return random elements depending on whether you are doing selection with or without replacement.
Selection with replacement: (roll of a die) <lang perl6>(1..6).roll; # return 1 random value in the range 1 through 6 (1..6).roll(3); # return a list of 3 random values in the range 1 through 6 (1..6).roll(*); # return a lazy infinite list of random values in the range 1 through 6</lang>
Selection without replacement: (pick a card from a deck)
<lang perl6>( 2..9, <J Q K A> X~ <♠ ♣ ♥ ♦> ).pick; # Pick a card
( 2..9, <J Q K A> X~ <♠ ♣ ♥ ♦> ).pick(5); # Draw 5
( 2..9, <J Q K A> X~ <♠ ♣ ♥ ♦> ).pick(*); # Get a shuffled deck</lang>
PicoLisp
<lang PicoLisp>(get Lst (rand 1 (length Lst)))</lang>
Python
<lang python>>>> import random >>> random.choice(['foo', 'bar', 'baz']) 'baz'</lang>
Ruby
<lang ruby>irb(main):001:0> %w(north east south west).sample => "west" irb(main):002:0> (1..100).to_a.sample(2) => [17, 79]</lang>
<lang ruby>irb(main):001:0> %w(north east south west).choice => "south"</lang>
Smalltalk
<lang smalltalk>x := #(1 2 3) atRandom.</lang>