如果我有一个这样的列表
我想从此列表中选择10,000个值,但我希望所选值与它们相关的权重相匹配。因此,大约85%的选定值应该是“White British”。
我一直在尝试使用LINQ,但没有运气。
var items = from dataItem in listOfItems
where (dataItem.uses / listOfItems.Count) <= dataItem.weighting
select dataItem;
使用的是选择该值的次数,listOfItems.Count是到目前为止已选择的总数。
由于
答案 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;
}
}
这将简单地使用给定的百分比将结果量(或更好的底值)添加到结果中,最后添加随机结果,直到达到所需的样本量。
注意:最后的随机结果将根据给定的分布
添加