【问题标题】:Select item from list according to weighting根据权重从列表中选择项目
【发布时间】:2011-08-22 09:30:22
【问题描述】:

如果我有这样的清单

  • 英国白人,85.67
  • 白色(其他),5.27
  • 爱尔兰白人,1.2
  • 混血,1.2
  • 印度,1.8
  • 巴基斯坦,1.3
  • 孟加拉国,0.5
  • 其他亚洲人(非中国人),0.4
  • 加勒比黑,1
  • 非洲黑人,0.8
  • 黑色(其他),0.2
  • 中文,0.4
  • 其他,0.4

例如,我想从此列表中选择 10,000 个值,但我想让所选值与与其关联的权重相匹配。所以大约 85% 的选定值应该是“英国白人”。

我一直在尝试使用 LINQ,但没有成功。

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

其中 uses 是该值被选中的次数,而 listOfItems.Count 是到目前为止总共被选中的次数。

谢谢

【问题讨论】:

  • Random weighted choice的可能重复
  • dataItem.uses 是整数吗?如果是这种情况,那么:where (dataItem.uses / listOfItems.Count) &lt;= dataItem.weighting 将进行整数运算,因此您不会得到您期望的结果。您需要转换为浮点类型:where ((double)(dataItem.uses) / (double)(listOfItems.Count)) &lt;= dataItem.weighting。虽然它可能无法解决您的根本问题。

标签: c# .net random


【解决方案1】:

我想尝试从“英国白人”、“白人”……创建 10000 个值,结果集的分布应该接近(更好地等于)您给出的百分比。

这是我对解决方案的尝试:


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

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

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

            return result;
        }
    }

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

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

【讨论】:

  • 哇,看起来非常完美。但是,如果我有 1000 条信息并且只希望样本大小为 10,会发生什么情况?
  • 那么代码将按原样失败(请参阅最后一条评论)-在这种情况下,您必须根据分布添加最后一个随机元素-因此按降序百分比排序(称为 l),选择一个从 0 到 100 的随机值(并将其称为 p),然后在值 (l) 中搜索最后一个值
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多