对不起,标题不好用。
我有一个名为NGram的对象
class NGram
{
//other properties
double Probability {get; set;} //Value between 1 and 0
}
现在假设我有这些对象的列表,例如...
List<NGrams> grams = GetNGrams();
Debug.Assert(grams.Sum(x => x.Probability) == 1);
如何在考虑概率分布的同时从此列表中选择随机项目。
例如,假设
grams[0].Probability == 0.5
然后应该有50%的机会选择grams[0]
我认为我可能需要类似
rand.NextDouble()
的东西,但我很茫然。 最佳答案
这是一种更通用的方法(意味着您无需断言概率加1):
static Random rand = new Random();
public NGram GetRandom(IEnumerable<NGram> pool)
{
// get universal probability
double u = pool.Sum (p => p.Probability);
// pick a random number between 0 and u
double r = rand.NextDouble() * u;
double sum = 0;
foreach(NGram n in pool)
{
// loop until the random number is less than our cumulative probability
if(r <= (sum = sum + n.Probability))
{
return n;
}
}
// should never get here
return null;
}
关于c# - 从列表中选择随机项目,并给出每个项目的概率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38086513/