如何随机均衡不相等的值?

时间:2018-11-29 17:55:44

标签: random probability equalizer

说我有多个不相等的值a,b,c,d和e。仅通过使用随机数生成,就可以将这些不相等的值转换为相等的值吗?

示例:a = 100,b = 140,c = 200,d = 2,e = 1000。我希望算法随机地将这些集合作为目标,以使最大的价值成为最频繁的目标,而对于大多数部分而言,最小的价值则被单独保留。

我遇到问题的区域:如果我仅使用非唯一随机数生成,则值e最终将落在其他值之下。如果使用唯一的数字生成,则即使绝对值不变,值之间的比率也不会改变。我试过使用在值更改前必须击中一定次数的数字的集合。我还没有尝试使用唯一/非唯一随机数的组合。

我希望算法运行时值之间的比率逐渐接近1。

考虑问题的另一种方法:说这些值a,b,c,d,e都相等。如果我们随机选择一个,则每个选择的可能性与其他任何选择的可能性一样。选择一个后,我们向该值加1。然后,我们再次运行此过程。这次,上次选择的值比其他任何值大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]