我正在寻找这个算法
(将从元素列表中随机选择的算法,其中每个元素具有不同的被挑选概率(权重))
并且发现只有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#中重新制作,请发布您的代码
答案 0 :(得分:6)
以下是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)]
答案 1 :(得分:5)
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)