Pick random element

From Rosetta Code
Task
Pick random element
You are encouraged to solve this task according to the task description, using any language you may know.

Demonstrate how to pick a random element from a list.

C

<lang C>#include <stdio.h>

  1. include <stdlib.h>
  2. include <time.h>

int main(){

 char array[] = { 'a', 'b', 'c' };
 srand( time( 0 ) );
 printf( "%c\n", array[ rand() % 3 ] );
 return 0;

}</lang>

D

<lang D>import std.stdio, std.random;

void main() {

   auto items = ["foo", "bar", "baz"];
   auto r = items[uniform(0, items.length)];
   writeln(r);

}</lang>

Euphoria

<lang euphoria>constant s = {'a', 'b', 'c'} puts(1,s[rand($)])</lang>

Go

<lang go>package main

import (

   "fmt"
   "rand"
   "time"

)

var list = []string{"bleen", "fuligin", "garrow", "grue", "hooloovoo"}

func main() {

   rand.Seed(time.Nanoseconds())
   fmt.Println(list[rand.Intn(len(list))])

}</lang>

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>

J

<lang j> ({~ ?@#) 'abcdef' b</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 removed the item from the list.

JavaScript

<lang javascript>var array = [1,2,3]; return array[Math.floor(Math.random() * array.length)];</lang>

Liberty BASIC

The natural way to hold an array of text is in a space- or comma-delimited string, although an array could be used. <lang lb> list$ ="John Paul George Ringo Peter Paul Mary Obama Putin" wantedTerm =int( 10 *rnd( 1)) print "Selecting term "; wantedTerm; " in the list, which was "; word$( list$, wantedTerm, " ") </lang>

Selecting term 5 in the list, which was Peter

OCaml

With a list: <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

With an array: <lang ocaml>let array_rand ary =

 let len = Array.length ary in
 ary.(Random.int len)</lang>
# array_rand [|1;2;3;4;5|] ;;
- : int = 3

PARI/GP

<lang parigp>pick(v)=v[random(#v)+1]</lang>

PHP

<lang php>$arr = array('foo', 'bar', 'baz'); $x = $arr[array_rand($arr)];</lang>

Perl

<lang perl>my @array = ('a', 'b', 'c'); print $array[ rand @array ];</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

Works with: Ruby version 1.9

<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>

Works with: Ruby version 1.8, but not 1.9

<lang ruby>irb(main):001:0> %w(north east south west).choice => "south"</lang>

Seed7

<lang seed7>$ include "seed7_05.s7i";

const proc: main is func

 begin
   writeln(rand([] ("foo", "bar", "baz")));
 end func;</lang>

Smalltalk

<lang smalltalk>x := #(1 2 3) atRandom.</lang>

Tcl

Random selection from a list is implemented by composing lindex (for selection of an item from a list) and the pattern for generating an integral random number from the range . It's simpler to use when wrapped up as a helper procedure: <lang tcl>proc randelem {list} {

   lindex $list [expr {int(rand()*[llength $list])}]

} set x [randelem {1 2 3 4 5}]</lang>