亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

隨機加權選擇

隨機加權選擇

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 關注
  • 598 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號