我想选择一个列表元素,其中每个元素的权重是自上次选中以来的长度。
我可以创建一个LRU(最近最少使用的)列表,其中加权函数基于队列中的位置,这将是优雅的,除了最初所有元素应该被加权相等的事实。
在选择之后,只需将权重减去或除以一定量就不直观了。是否有更好的方法可能使用数学概念,如对数或逆? (不是我的强项)
答案 0 :(得分:0)
这样的事情怎么样:
让n
= 元素数量,list
= 元素数组,watermark
:= 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]
这里我们将列表分为加权和统一两部分,边界由watermark
跟踪。最初,加权部分是空的,但逐渐增长,最终消耗整个列表。
random()
是一个以[0.0,1.0)返回随机数的函数。
weight(x)
是从[0.0,1.0到[0.0,1.0]的函数,它定义了所需的加权行为。
“r * n / watermark
”作为weight()
的参数用于规范化参数范围。对于加权函数的某些选择,可能不需要这种标准化。