对于产生精确的位模式的问题n
设置位,我知道两种实用的方法,但它们都有我不满意的局限性。
首先,您可以枚举在预先计算的表中设置了那么多位的所有可能的字值,然后在该表中生成一个随机索引以挑选出可能的结果。这样做的问题是,随着输出大小的增长,候选输出列表最终会变得不切实际的大。
或者,您可以选择n
随机不重叠的位位置(例如,通过使用部分 Fisher-Yates 混洗)并仅设置这些位。然而,这种方法在比可能结果的数量大得多的空间中计算随机状态。例如,它可以选择三个比特中的第一位和第二位,或者它可以单独选择第二位和第一位。
第二种方法必须消耗比严格要求更多的随机数源位。既然是选择n
当它们的顺序不重要时,按特定顺序排列位,这意味着它正在任意区分n!
产生相同结果的不同方式,并且至少消耗floor(log_2(n!))
比需要的更多位。
这可以避免吗?
显然还有第三种方法,即迭代计算并计算合法排列,直到达到随机索引,但这只是第一种方法的空间与时间权衡,除非存在有效的方法,否则没有直接帮助。计算这些的方法n
排列。
澄清
The first approach requires picking a single random number between zero and (where w
is the output size), as this is the number of possible solutions.
The second approach requires picking n
random values between zero and w-1
, zero and w-2
, etc., and these have a product of , which is times larger than the first approach.
这意味着随机数源被迫产生位来区分n!
不同的结果都是等价的。我想知道是否有一种有效的方法来避免依赖这种多余的随机性。也许通过使用产生位位置无序列表的算法,或者通过直接计算第 n 个唯一的位排列。