说我有多个不相等的值a,b,c,d和e。仅通过使用随机数生成,就可以将这些不相等的值转换为相等的值吗?
示例:a = 100,b = 140,c = 200,d = 2,e = 1000。我希望算法随机地将这些集合作为目标,以使最大的价值成为最频繁的目标,而对于大多数部分而言,最小的价值则被单独保留。
我遇到问题的区域:如果我仅使用非唯一随机数生成,则值e最终将落在其他值之下。如果使用唯一的数字生成,则即使绝对值不变,值之间的比率也不会改变。我试过使用在值更改前必须击中一定次数的数字的集合。我还没有尝试使用唯一/非唯一随机数的组合。
我希望算法运行时值之间的比率逐渐接近1。
考虑问题的另一种方法:说这些值a,b,c,d,e都相等。如果我们随机选择一个,则每个选择的可能性与其他任何选择的可能性一样。选择一个后,我们向该值加1。然后,我们再次运行此过程。这次,上次选择的值比其他任何值大1,因此比其他任何一个值更容易被选择。这会产生滚雪球效应,在这种情况下,首先选择的值可能会继续被选择并实现失控的增长。我正在寻找与该算法相反的方法,该算法是在这些本来相等的值分开之后才开始,然后将它们带回到本本相等的状态。
由于熵和存在的固有单向性,我认为这个过程是不可能的。
答案 0 :(得分:0)
好吧,有一种叫做“权重反比”的技术,您可以对与它们以前的外观成反比的项进行采样。每次采样a,b,c,d或e时,我们都会更新它们的出现次数并重新计算概率。简单的python代码,我将数字[0 ... 4]采样为a,b,c,d和e,并从您列出的外观开始。 100,000个样本后,它们看起来是均匀分布的
import numpy as np
n = np.array([100, 140, 200, 2, 1000])
for k in range(1, 100000):
p = (1.0 / n) # make probabilities inverse to weights
p /= np.sum(p) # normalization
a = np.random.choice(5, p = p) # sampling numbers in the range [0...5)
n[a] += 1 # update weights
print(n)
输出
[20260 20194 20290 20305 20392]