假设我为您提供了0到1之间的随机种子,但是经过一些观察,您发现我的种子分布不正确,其中大多数种子少于0.5 ,您是否仍然可以通过使用使种子更加分散的算法来使用该资源?
如果是,请提供必要的信息。
答案 0 :(得分:1)
这实际上取决于间隔[0 ... 1]中数字的分配方式。通常,您需要CDF(累积分布函数)将任意的[0 ... 1]域分布映射为统一的[0 ... 1]。但是对于某些特定情况,您可以进行一些简单的转换。下面的代码(在Python中)首先构造了简单的不公平RNG,该RNG会生成低于0.5的数字的60%和高于40%的数字。
import random
def unfairRng():
q = random.random()
if q < 0.6: # result is skewed toward [0...0.5] interval
return 0.5*random.random()
return 0.5 + 0.5*random.random()
random.seed(312345)
nof_trials = 100000
h = [0, 0]
for k in range(0, nof_trials):
q = unfairRng()
h[0 if q < 0.5 else 1] += 1
print(h)
然后我计算出高于和低于0.5的数字,并且我的计算机上的输出是
[60086, 39914]
这与我描述的60/40分割非常接近。
好吧,让我们通过从unfairRNG中获取数字并交替返回值和下次返回1值来“修复” RNG。同样,Python代码
def fairRng():
if (fairRng.even == 0):
fairRng.even = 1
return unfairRng()
else:
fairRng.even = 0
return 1.0 - unfairRng()
fairRng.even = 0
h = [0, 0]
for k in range(0, nof_trials):
q = fairRng()
h[0 if q < 0.5 else 1] += 1
print(h)
再次计算直方图,结果为
[49917, 50083]
“修复”不公平的RNG并使其公平。
答案 1 :(得分:0)
将硬币从不公平硬币中翻转出来是通过翻转两次,如果结果不同,则使用第一个。否则,丢弃结果。
这导致硬币的几率恰好为50/50,但不能保证在有限的时间内运行。
答案 2 :(得分:0)