Random 根据最近的先前选择加权的随机选择

Random 根据最近的先前选择加权的随机选择,random,selection,lru,weighting,Random,Selection,Lru,Weighting,我想从列表中选择一个元素,其中每个元素的权重取决于自上次选择以来的时间长度 我可以创建一个LRU(最近使用最少的)列表,其中包含一个基于队列中位置的加权函数,这将是一个优雅的列表,除了一个事实,即最初所有元素的加权应该相等 从直觉上看,在选定权重后,仅将权重减去或除以一定数量似乎并不正确。有没有更好的方法可以使用数学概念,如对数或逆?(不是我的强项)像这样的东西怎么样: 让n=元素数,列表=元素数组,水印:=0 r := random() i := floor(r * n) if i >

我想从列表中选择一个元素,其中每个元素的权重取决于自上次选择以来的时间长度

我可以创建一个LRU(最近使用最少的)列表,其中包含一个基于队列中位置的加权函数,这将是一个优雅的列表,除了一个事实,即最初所有元素的加权应该相等


从直觉上看,在选定权重后,仅将权重减去或除以一定数量似乎并不正确。有没有更好的方法可以使用数学概念,如对数或逆?(不是我的强项)

像这样的东西怎么样:

n
=元素数,
列表
=元素数组,
水印
:=0

r := random()
i := floor(r * n)

if i >= watermark :
    index := i
    watermark := watermark + 1  // weighted part grows
else :
    index := floor(weight(r * n / watermark) * watermark)
endif

move list[index] to list[0]     // shifting elements list[0..index-1] up one place
result := list[0]
在这里,我们将列表分为两部分,加权和均匀,边界由
水印
跟踪。最初,加权部分为空,但逐渐增加,最终消耗整个列表

random()
是一个函数,返回[0.0,1.0]中的随机数

weight(x)
是一个从[0.0,1.0]到[0.0,1.0]的函数,用于定义所需的加权行为


r*n/watermark
”作为
weight()的参数
用于规范化参数范围。也许在某些加权函数的选择中不需要这种规范化。

atzz我将尝试一下你的算法,看看它的表现如何谢谢!@hippietrail-不客气!请让我知道它是怎么做的,我也很感兴趣:)我担心的一件事是,如果列表变得庞大每次选择后,我可能会使用大量CPU重新计算“断点”,而如果使用严格的LRU和权重作为队列中位置的函数,这些断点将永远不会改变。@hippietrail-我认为这里最复杂的操作是列表修改,即O(n)。但也需要维护简单的LRU,不是吗?“水印”只是一个简单的整数,它不应该影响任何东西。