使用c#从具有概率加权的列表中选择随机项目
本文关键字:列表 选择 随机 项目 加权 概率 使用 | 更新日期: 2023-09-27 18:16:01
我有一个场景,我正在从我的数据库中获取用户列表(20个用户),我在那里给出用户权重
前5个用户的概率因子为4接下来5个用户的概率因子为3接下来5个用户的概率因子为2下5个用户的概率因子为1
所以在前5个用户中出现的用户是4倍多
那么我如何在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;
. .其中,users
为Dictionary<int,int>
(Key =用户号,Value =最大值),choice
为随机生成的值。
这显然比其他人提出的"多条目"方法更复杂,但如果您
a)需要一个分数权重,这使得您的多条目方法的公分母非常小(导致许多条目)或
b)需要对特定用户给予很大的权重(这将再次使多重输入方法变得非常大)。