使用c#从具有概率加权的列表中选择随机项目

本文关键字:列表 选择 随机 项目 加权 概率 使用 | 更新日期: 2023-09-27 18:16:01

我有一个场景,我正在从我的数据库中获取用户列表(20个用户),我在那里给出用户权重

前5个用户的概率因子为4接下来5个用户的概率因子为3接下来5个用户的概率因子为2下5个用户的概率因子为1

所以在前5个用户中出现的用户是4倍多

那么我如何在c#中使用概率从列表中选择一个随机用户?有人能帮我做这件事吗?我在逻辑上完全卡住了。

使用c#从具有概率加权的列表中选择随机项目

您可以在列表中添加使用概率次数。所以前5个用户在列表中出现4次,后5个用户出现3次,以此类推。然后从完整的列表中选择一个用户。

创建权重的部分和列表。在您的示例中,它将是

[4, 8, 12, 16, 20, 23, ...]

最后一个元素是所有权重的和。在0和这个和(不包括)之间随机选择一个数字。那么你的元素是第一个部分和大于随机数的元素。如果是11,就需要第三个元素,如果是16,就需要第五个元素,等等

我有一个(有点冒牌的)解决方案:

创建一个包含用户的列表,其中每个用户的添加次数与其权重相同。(例如,用户的权重为5,将他添加到列表中5次)。然后我们使用Random从列表中获取用户,这应该可以解决您的问题。

一种解决方案是找到权重的最小公分母(或者只是将它们相乘),并创建一个包含第一个列表的键的新列表,但是要多次,即:

user1user1user2user3user3user3

然后只到一个newList.skip(Random.Next(newList.Count)).Take(1),你就设置好了!

您可以使用字典在用户之间分配概率范围。如

用户1有1-4(所以最大值为4)

用户2有5-8个(最多8个)等等。

然后在选择随机数后,查找它与字典中哪个用户相关。你可以使用Linq这样做:

int iUser = users.Where(p => (choice <= p.Value)).First().Key;

. .其中,usersDictionary<int,int> (Key =用户号,Value =最大值),choice为随机生成的值。

这显然比其他人提出的"多条目"方法更复杂,但如果您

a)需要一个分数权重,这使得您的多条目方法的公分母非常小(导致许多条目)

b)需要对特定用户给予很大的权重(这将再次使多重输入方法变得非常大)。