gpt4 book ai didi

algorithm - rng 最高效的均匀随机整数算法是什么?

转载 作者:行者123 更新时间:2023-12-05 05:47:31 25 4
gpt4 key购买 nike

<分区>

这不是 #11766794 “What is the optimal algorithm for generating an unbiased random integer within a range?” 的副本.它的最高投票答案和接受答案都与浮点外推有关,它甚至不会产生完全统一的整数。这个问题是在询问如何快速获得统一随机整数的良好近似值,给定可服务的统一 float rand()值(value);我是在完美统一随机整数算法的背景下问这个问题的,给定一个真实的random bit generator。 (确定性或其他;问题同样适用于任何一种方式)。

具体来说,我要问的是关于效率 w/r/t 使用随机比特方面的理论最优性:给定一个随机比特流,算法是什么在给定范围内生成完全均匀的随机整数的过程中,它消耗的位数最少?

例如,CPython 3.9.0's random.randbelow 至少有一个微不足道的低效率——当调用 2 的任意幂(包括微不足道的范围)时,它会浪费一个随机位:

def randbelow(n):
"Return a random int in the range [0,n). Returns 0 if n==0."
if not n:
return 0
k = n.bit_length() # don't use (n-1) here because n can be 1
r = getrandbits(k) # 0 <= r < 2**k
while r >= n:
r = getrandbits(k)
return r

虽然通过将“not n”替换为“n <= 1”和将“n.bit_length()”替换为“(n-1).bit_length()”很容易修补,但一点分析表明它还有更多不足之处:

假设要生成一个范围在 [0, 4097) 范围内的整数: 一半getrandbits(13) 的所有调用将超出该值:如果第一位和,,第二位是高电平,无论如何它都会消耗 11 个更多位,并在看似没有消耗时丢弃它们需要。所以看起来这个算法显然不是最优的。

今晚我能在一个小时内得出的最好结果是以下算法:

def randbelow(n):
if n <= 1:
return 0
k = (n - 1).bit_length() # this is POPCNT for bignums
while True:
r = 0
for i in reversed(range(k)):
r |= getrandbits(1) << i
if r >= n:
break
else:
return r

但是,我不是数学家,仅仅因为我修复了我可以立即看到的低效问题,并不能给我任何信心,让我相信我在一个下午就立即偶然发现了最有效的方法统一整数选择算法。

例如,比特是从量子或大气 RNG 服务购买的;或作为多方协议(protocol)的一部分,其中每个单独的位生成都需要多次往返;或 an embedded device without any hardware RNG support ...无论情况如何,我只问一个直接的问题:从真正的随机比特流生成(完美)均匀随机整数的算法是最有效的相对于随机比特消耗? (或者,如果不确定, 什么是当前最佳候选人?)

(我在这些示例中使用了 Python,因为这是我本赛季主要从事的工作,但这个问题绝不是特定于任何语言的,除非算法本身必须概括为数字超过 264.)

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com