c# - 从排序列表中加权随机选择

标签 c# random data-structures sortedlist

我有一个问题,我有一大堆按“权重”排序的项目。我需要能够从此列表中随机选择项目,但越接近开始(权重越大)的项目必须有更大的机会根据“精英主义”因素被选中。

我知道以前有人问过类似的问题,但这里要注意的是这个列表会随着时间的推移而改变。删除最后一项时,新值将被排序到列表中(以保持大小不变​​的“优化”值池)。

首先,最有效的选择方法是什么?必须从 50 到 1000 项长度不等的列表中实时进行选择。

其次,在这里使用什么数据结构最好?我正在使用 C#。

我只是想到了一个可能的解决方案,但我希望得到一些关于这个想法的反馈。如果我要生成一个特定范围内的随机浮点值,然后按照对它求平方的方式做一些事情,会怎样?小值将返回小值,大值将返回大得多的值。据我所知,将此结果映射到列表的长度应该会产生预期的效果。这听起来对吗?

最佳答案

很遗憾,我现在无法提供任何代码,但有一些想法:

由于您的列表是从高权重到低权重排序的,因此您应该能够使用基于正态分布的随机数生成器。如果手边没有这样的随机数生成器,可以使用此处的代码将均匀分布转换为正态分布:Random Gaussian Variables

我不善于解释,但我会尝试: 您可以将偏差(平均值)定义为 0,将西格玛(偏差)定义为 3。然后您从生成的数字中获取绝对值,因为您可能会得到负数。

这将为您提供一个数字生成器,它在偏差数(上例中为 0)附近的概率很高,而偏离那里的数字概率较低。

正如我所说,我不擅长解释

关于c# - 从排序列表中加权随机选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29819994/

相关文章:

random - JMeter:几个采样器之间的相同 UUID

c - 没有递归的遍历树和C中的堆栈

c# - .Net 中的依赖注入(inject)?

c# - 查找整数列表中是否存在整数

c# - 运行时绑定(bind)异常 : Cannot perform runtime binding on a null reference

algorithm - 查找给定数组中每个窗口大小的最大值或最小值

c++ - 点云数据的稀疏体素表示

c# - 剖析字符串以在 C# 中执行带参数的类/方法

javascript - 更改页面的背景颜色

c - 抽签时如何重新开始游戏