【发布时间】:2020-09-07 14:48:39
【问题描述】:
假设我有一个非统一的函数,它在集合 A 中生成元素。我有一个集合 B,它有可能在 A 中生成每个元素。有什么方法可以制作非统一的伪随机函数表现得像一个统一的伪随机函数。
【问题讨论】:
-
你能放一些代码吗?目前还不清楚你想要什么。您想从 A 中统一选择吗?然后以概率 1/sizeof(N) 进行采样
标签: algorithm math optimization random
假设我有一个非统一的函数,它在集合 A 中生成元素。我有一个集合 B,它有可能在 A 中生成每个元素。有什么方法可以制作非统一的伪随机函数表现得像一个统一的伪随机函数。
【问题讨论】:
标签: algorithm math optimization random
当然。以均匀概率从 A 生成元素的简单方法:
一种有效的方法是根据给定的概率使用范围编码器对随机(非均匀)元素流进行编码。这将生成一个统一的随机位流。然后,您可以假设所有符号的概率相等,从而得到 A 的均匀分布的元素。请参阅:https://en.wikipedia.org/wiki/Range_encoding
另一种生成统一随机比特流的方法是计算随机源的熵,然后将输出分成块并使用 SHA-1 等加密散列函数进行散列。块应该足够大以提供比散列函数的位长度更多的熵位。这种方法在现实生活中可能更安全,因为即使您对生成器生成的符号分布有误,它也可以工作。见:https://en.wikipedia.org/wiki/Entropy_(information_theory)
【讨论】:
让我建议一个简单的算法,您不需要知道选择 A 中的每个元素的概率(在您的问题中设置 B)。我假设 A 中的每个元素都有一个已知的顺序(例如,每个元素都是一个数字)。
算法有两个部分。第一个是生成无偏随机位的算法。我们将其称为“RandomBit()”(Morina et al. 2019)。
这是有效的,因为来自 A 的独立的独立抽签对在统计上是无差异的(Montes Gutiérrez 2014, De Schuymer et al. 2003);有关详细信息,请参阅我的Note on Randomness Extraction 的附录。
接下来是在 [0, 1] 中生成均匀随机数的算法。您所要做的就是“并置足够多的随机二进制数字”(von Neumann 1951):添加 RandomBit()/2 + RandomBit()/4 + RandomBit()/8 + ....
如果您的非均匀分布是正态分布,请参阅交叉验证上的以下问题以了解更多技巧:https://stats.stackexchange.com/questions/117689
参考:
【讨论】: