根据权重从列表中选择项目

时间:2011-08-22 09:30:22

标签: c# .net random

如果我有一个这样的列表

  • White British,85.67
  • 白色(其他),5.27
  • White Irish,1.2
  • 混血赛,1.2
  • 印度人,1.8
  • 巴基斯坦,1.3
  • 孟加拉国,0.5
  • 其他亚洲(非中国人),0.4
  • Black Caribbean,1
  • 黑非洲人,0.8
  • 黑色(其他),0.2
  • 中文,0.4
  • 其他,0.4

我想从此列表中选择10,000个值,但我希望所选值与它们相关的权重相匹配。因此,大约85%的选定值应该是“White British”。

我一直在尝试使用LINQ,但没有运气。

var items = from dataItem in listOfItems
where (dataItem.uses / listOfItems.Count) <= dataItem.weighting
select dataItem;

使用的是选择该值的次数,listOfItems.Count是到目前为止已选择的总数。

由于

1 个答案:

答案 0 :(得分:0)

我想尝试从“白色英国”,“白色”中创建10000个值......并且结果集应该具有接近(更好地等于)您给出的百分比的分布。

这是我尝试解决方案:


    struct Info
    {
        public string Name { get; set; }
        public float Percent { get; set; }
    }

    class Statistics
    {
        public IEnumerable<string> CreateSampleSet(int sampleSize, params Info[] infos)
        {
            var rnd = new Random();
            var result = new List<string>();
            infos = infos.OrderByDescending(x => x.Percent).ToArray();
            foreach (var info in infos)
            {
                for(var _ = 0; _ < (int)(info.Percent/100.0*sampleSize); _++)
                result.Add(info.Name);
            }

            if (result.Count < sampleSize)
            {
                while (result.Count < sampleSize)
                {
                    var p = rnd.NextDouble()*100;
                    var value = infos.First(x => x.Percent <= p);
                    result.Add(value.Name);
                }
            }

            return result;
        }
    }

这将简单地使用给定的百分比将结果量(或更好的底值)添加到结果中,最后添加随机结果,直到达到所需的样本量。

注意:最后的随机结果将根据给定的分布

添加