自校正概率分布——保持随机性,同时将每个结果的频率引向其概率
Self-Correcting Probability Distribution - Maintain randomness, while gravitating each outcome's frequency towards its probability
这是一个常见的问题,当你想引入随机性,但同时你希望你的实验贴近预期的概率分布,并且不能/不想依靠大数定律.
假设您为一枚硬币编写了 50-50 次出现正面/反面的机会。如果你模拟 100 次,很可能你会得到接近预期的 50-50(二元分布以 50-50 为中心)。
但是,如果您想要对任意次数的实验重复进行类似的确定性,该怎么办。
我们的一位客户问我们这个::
We may also need to add some restrictions on some of the randomizations (e.g. if spatial location of our stimuli is totally random, the program could present too many stimuli in some locations and not very many in others. Locations should be equally sampled, so more of an array that is shuffled instead of randomization with replacement).
所以他们想要他们可以控制的随机性。
撇开实施细节(数组,与其他方法相比),我们客户问题的预期结果如下 ::
Always have as close to 1 / N of the stimuli in each of the N potential locations, yet do so in a randomized (hard-to-predict) way.
这在游戏中很常见(在分发对象、角色、统计数据时,..),我想还有很多其他应用程序。
我处理这个问题的首选方法是根据到目前为止的实验情况动态加权预期概率。这有效地使我们远离独立绘制的变量。
- 令 p[i] 为结果 i
的期望概率
- 令 N[i] 为结果 i 到目前为止发生的次数
- 令 N 为所有结果 i
的 N[] 之和
- 令 w[i] 为 i
的校正权重
- 让 W_Max 成为您要分配的最大权重(即当结果发生 0 次时)
- 令 P[i] 为 i
的非归一化概率
- 那么p_c[i]就是i
的修正概率
p[i]是固定的,由设计提供。 N[i] 是一个累加 - 每次 i 发生时,N[i] 增加 1.
w[i] 由
给出
w[i] = CalculateWeight(p[i], N[i], N, W_Max)
{
if (N == 0) return 1;
if (N[i] == 0) return W_Max;
intended = p[i] * N
current = N[i]
return intended / current;
}
P[i]由
给出
P[i] = p[i] * w[i]
然后我们计算p_c[i]为
p_c[i] = P[i] / sum(P[i])
我们 运行 我们的随机实验(抽样)的下一次迭代使用 p_c[i] 而不是 p[i] 作为结果 i.
主要缺点是您用控制换取了可预测性。连续 4 个反面后,很可能会看到正面。
注 1 :: 如果实验结果与预期结果相匹配,或偏向(偏离)发生次数少于(多)预期的结果,所描述的方法将在任何步骤提供接近原始的分布。
注2 ::可以引入一个"control"参数c,多加一个步骤。
p_c2[i] = c * p_c[i] + (1-c) * p[i]
对于c = 1,这默认为描述的方法,对于c = 0,它默认为原始概率(独立绘制的变量)。
这是一个常见的问题,当你想引入随机性,但同时你希望你的实验贴近预期的概率分布,并且不能/不想依靠大数定律.
假设您为一枚硬币编写了 50-50 次出现正面/反面的机会。如果你模拟 100 次,很可能你会得到接近预期的 50-50(二元分布以 50-50 为中心)。
但是,如果您想要对任意次数的实验重复进行类似的确定性,该怎么办。
我们的一位客户问我们这个::
We may also need to add some restrictions on some of the randomizations (e.g. if spatial location of our stimuli is totally random, the program could present too many stimuli in some locations and not very many in others. Locations should be equally sampled, so more of an array that is shuffled instead of randomization with replacement).
所以他们想要他们可以控制的随机性。
撇开实施细节(数组,与其他方法相比),我们客户问题的预期结果如下 ::
Always have as close to 1 / N of the stimuli in each of the N potential locations, yet do so in a randomized (hard-to-predict) way.
这在游戏中很常见(在分发对象、角色、统计数据时,..),我想还有很多其他应用程序。
我处理这个问题的首选方法是根据到目前为止的实验情况动态加权预期概率。这有效地使我们远离独立绘制的变量。
- 令 p[i] 为结果 i 的期望概率
- 令 N[i] 为结果 i 到目前为止发生的次数
- 令 N 为所有结果 i 的 N[] 之和
- 令 w[i] 为 i 的校正权重
- 让 W_Max 成为您要分配的最大权重(即当结果发生 0 次时)
- 令 P[i] 为 i 的非归一化概率
- 那么p_c[i]就是i 的修正概率
p[i]是固定的,由设计提供。 N[i] 是一个累加 - 每次 i 发生时,N[i] 增加 1.
w[i] 由
给出w[i] = CalculateWeight(p[i], N[i], N, W_Max)
{
if (N == 0) return 1;
if (N[i] == 0) return W_Max;
intended = p[i] * N
current = N[i]
return intended / current;
}
P[i]由
给出P[i] = p[i] * w[i]
然后我们计算p_c[i]为
p_c[i] = P[i] / sum(P[i])
我们 运行 我们的随机实验(抽样)的下一次迭代使用 p_c[i] 而不是 p[i] 作为结果 i.
主要缺点是您用控制换取了可预测性。连续 4 个反面后,很可能会看到正面。
注 1 :: 如果实验结果与预期结果相匹配,或偏向(偏离)发生次数少于(多)预期的结果,所描述的方法将在任何步骤提供接近原始的分布。
注2 ::可以引入一个"control"参数c,多加一个步骤。
p_c2[i] = c * p_c[i] + (1-c) * p[i]
对于c = 1,这默认为描述的方法,对于c = 0,它默认为原始概率(独立绘制的变量)。