使用Walker的别名方法的加权随机选择(Weighted random selection using Walker's Alias Method)
我正在寻找这个算法 (从每个元素具有不同拾取概率(重量)的元素列表中随机选择的算法) 并发现只有python和c实现,我做了一个C#之后,有点不同(但我认为更简单)我想我应该分享它,也需要一个F#imlementation ,如果任何人都可以做出来,请发表一个答案
using System; using System.Collections.Generic; using System.Linq; namespace ChuckNorris { class Program { static void Main(string[] args) { var oo = new Dictionary<string, int> { {"A",7}, {"B",1}, {"C",9}, {"D",8}, {"E",11}, }; var rnd = new Random(); var pick = rnd.Next(oo.Values.Sum()); var sum = 0; var res = ""; foreach (var o in oo) { sum += o.Value; if(sum >= pick) { res = o.Key; break; } } Console.WriteLine("result is "+ res); } } }如果任何人都可以在F#中重制它,请发布您的代码
I was looking for this algorithm (algorithm which will randomly select from a list of elements where each element has different probability of being picked (weight) ) and found only python and c implementations, after I did a C# one, a bit different (but I think simpler) I thought I should share it, also I need an F# imlementation, if anyone can make it please post an answer
using System; using System.Collections.Generic; using System.Linq; namespace ChuckNorris { class Program { static void Main(string[] args) { var oo = new Dictionary<string, int> { {"A",7}, {"B",1}, {"C",9}, {"D",8}, {"E",11}, }; var rnd = new Random(); var pick = rnd.Next(oo.Values.Sum()); var sum = 0; var res = ""; foreach (var o in oo) { sum += o.Value; if(sum >= pick) { res = o.Key; break; } } Console.WriteLine("result is "+ res); } } }if anyone can remake it in F# please post your code
最满意答案
这里是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)]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)]
更多推荐
发布评论