为了账号安全,请及时绑定邮箱和手机立即绑定

随机加权选择

随机加权选择

MMMHUHU 2019-12-21 13:06:38
考虑以下代表经纪人的类:public class Broker{    public string Name = string.Empty;    public int Weight = 0;    public Broker(string n, int w)    {        this.Name = n;        this.Weight = w;    }}考虑到它们的权重,我想从一个数组中随机选择一个Broker。您如何看待下面的代码?class Program    {        private static Random _rnd = new Random();        public static Broker GetBroker(List<Broker> brokers, int totalWeight)        {            // totalWeight is the sum of all brokers' weight            int randomNumber = _rnd.Next(0, totalWeight);            Broker selectedBroker = null;            foreach (Broker broker in brokers)            {                if (randomNumber <= broker.Weight)                {                    selectedBroker = broker;                    break;                }                randomNumber = randomNumber - broker.Weight;            }            return selectedBroker;        }        static void Main(string[] args)        {            List<Broker> brokers = new List<Broker>();            brokers.Add(new Broker("A", 10));            brokers.Add(new Broker("B", 20));            brokers.Add(new Broker("C", 20));            brokers.Add(new Broker("D", 10));            // total the weigth            int totalWeight = 0;            foreach (Broker broker in brokers)            {                totalWeight += broker.Weight;            }            while (true)            {                Dictionary<string, int> result = new Dictionary<string, int>();                Broker selectedBroker = null;                for (int i = 0; i < 1000; i++)                {                    selectedBroker = GetBroker(brokers, totalWeight);                    if (selectedBroker != null)                    {                        if (result.ContainsKey(selectedBroker.Name))                        {                            result[selectedBroker.Name] = result[selectedBroker.Name] + 1;                        }我不太自信 当我运行此代码时,经纪人A总是比经纪人D获得更多的匹配,而且它们的权重相同。有没有更准确的算法?
查看完整描述

4 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

class Program

{

    static void Main(string[] args)

    {

        var books = new List<Book> {

        new Book{Isbn=1,Name="A",Weight=1},

        new Book{Isbn=2,Name="B",Weight=100},

        new Book{Isbn=3,Name="C",Weight=1000},

        new Book{Isbn=4,Name="D",Weight=10000},

        new Book{Isbn=5,Name="E",Weight=100000}};


        Book randomlySelectedBook = WeightedRandomization.Choose(books);

    }

}


public static class WeightedRandomization

{

    public static T Choose<T>(List<T> list) where T : IWeighted

    {

        if (list.Count == 0)

        {

            return default(T);

        }


        int totalweight = list.Sum(c => c.Weight);

        Random rand = new Random();

        int choice = rand.Next(totalweight);

        int sum = 0;


        foreach (var obj in list)

        {

            for (int i = sum; i < obj.Weight + sum; i++)

            {

                if (i >= choice)

                {

                    return obj;

                }

            }

            sum += obj.Weight;

        }


        return list.First();

    }

}


public interface IWeighted

{

    int Weight { get; set; }

}


public class Book : IWeighted

{

    public int Isbn { get; set; }

    public string Name { get; set; }

    public int Weight { get; set; }

}


查看完整回答
反对 回复 2019-12-21
  • 4 回答
  • 0 关注
  • 518 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信