Weighted random selection using Walker's Alias Method

后端 未结 2 1052
既然无缘
既然无缘 2020-12-19 20:37


I was looking for this algorithm
(algorithm which will randomly select from a list of elements where each element has different probability of being

相关标签:
2条回答
  • 2020-12-19 20:54

    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)]
    
    0 讨论(0)
  • 2020-12-19 21:07
    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)
    
    0 讨论(0)
提交回复
热议问题