Zie*_*ARI 5 c# random list probability
我有一个包含四个项目(A、B、C、D)的列表。每个项目都有一个被选中的概率。例如,假设 A 有 74% 的机会被选中,B 15%,C 7% 和 D 4%。
我想创建一个函数,根据它的概率随机选择一个项目。
请问有什么帮助吗?
为您的项目定义一个类,如下所示:
class Items<T>
{
public double Probability { get; set; }
public T Item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后初始化它
var initial = new List<Items<string>>
{
new Items<string> {Probability = 74 / 100.0, Item = "A"},
new Items<string> {Probability = 15 / 100.0, Item = "B"},
new Items<string> {Probability = 7 / 100.0, Item = "C"},
new Items<string> {Probability = 4 / 100.0, Item = "D"},
};
Run Code Online (Sandbox Code Playgroud)
然后您需要将其转换为聚合从 0 到 1 的概率总和
var converted = new List<Items<string>>(initial.Count);
var sum = 0.0;
foreach (var item in initial.Take(initial.Count - 1))
{
sum += item.Probability;
converted.Add(new Items<string> {Probability = sum, Item = item.Item});
}
converted.Add(new Items<string> {Probability = 1.0, Item = initial.Last().Item});
Run Code Online (Sandbox Code Playgroud)
现在您可以converted根据概率从集合中选择一个项目:
var rnd = new Random();
while (true)
{
var probability = rnd.NextDouble();
var selected = converted.SkipWhile(i => i.Probability < probability).First();
Console.WriteLine($"Selected item = {selected.Item}");
}
Run Code Online (Sandbox Code Playgroud)
注意:我的实现很O(n)复杂。您可以使用二分搜索对其进行优化(因为converted集合中的值已排序)
| 归档时间: |
|
| 查看次数: |
6755 次 |
| 最近记录: |