Selección aleatoria ponderada utilizando el método de alias de Walker


Estaba buscando este algoritmo
(algoritmo que seleccionará aleatoriamente de una lista de elementos donde cada elemento tiene una probabilidad diferente de ser seleccionado (peso))
y encontré solo implementaciones de python yc, después de hacer un C # uno, un poco diferente (pero creo que más simple) pensé que debería compartirlo, también necesito unF # imlementation, si alguien puede hacerlo por favor publique una respuesta



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);
        }
    }
}

Si alguien puede rehacerlo en F #, por favor publique su código