I was looking for this algorithm
(algorithm which will randomly select from a list of elements where each element has different probability of being
Here is the similar code in F#:
let rng = new System.Random()
let d = [| "A", 3
"B", 2
"C", 3 |]
let sums = Seq.scan (+) 0 (dict d).Values |> Seq.skip 1 |> Seq.toArray
let pick = rng.Next(sums.[sums.Length-1])
let res = fst d.[sums |> Seq.findIndex ((<) pick)]
open System
let oo = dict [ "A", 7;
"B", 1;
"C", 9;
"D", 8;
"E", 11 ]
let rnd = Random()
let pick = oo.Values |> Seq.sum |> rnd.Next
let res = oo |> Seq.scan (fun (_, s) (KeyValue(k, v)) -> k, s + v) ("", 0)
|> Seq.tryPick (fun (k, s) -> if s >= pick
then printfn "Result is %s" k; Some k
else None)