# Idiom #158 Random sublist

Create a new list y from randomly picking exactly k elements from list x.

It is assumed that x has at least k elements.
Each element must have same probability to be picked.
Each element from x must be picked at most once.

`import System.Random (randomRIO)`
```randomSample :: Int -> [a] -> IO [a]
randomSample 0 x = pure []
randomSample k x = do
i <- randomRIO (0, length x - 1)
let (a, e:b) = splitAt i x
l <- randomSample (k-1) (a ++ b)
pure (e : l)```
`import std.random;`
`auto y = randomSample(x, k);`
1
`import "math/rand"`
```y := make([]T, k)
perm := rand.Perm(len(x))
for i, v := range perm[:k] {
y[i] = x[v]
}```
`Types, Math`
```function RandArr(Max: Integer): TIntegerDynArray;
var
i, j, temp: Integer;
begin
SetLength(Result, Max+1);
for i := Low(Result) to High(Result) do Result[i] := i;
i := Length(Result);
while i > 0 do
begin
Dec(i);
j := RandomRange(0,i);
temp := Result[i];
Result[i] := Result[j];
Result[j] := temp;
end;
end;

var
Idx: TIntegerDynArray;
begin
Idx := RandArr(High(X));
SetLength(Y, k);
for i := 0 to k-1 do Y[i] := X[Idx];
end.```
`y = x.sample(k)`

#### Idiom created by

programming-idioms.org