在 int 中反转 n 个不同的随机位

invert n different random bits in int

本文关键字:随机 int      更新时间:2023-10-16

如何有效地反转无符号整数 x 中的 n 位?每个位必须随机选择。此外,它只能选择一次。x 和返回结果之间的汉明距离必须等于 n。有O(n)解决方案吗?

// rnd_engine is kind of std::minstd_rand
template< typename rnd_engine >
unsigned int invert_bits( unsigned int x, unsigned int n, rnd_engine& rndEngine ) {
   assert( n <= sizeof( x ) * 4 );
   return // your ideas?
}
我会

执行以下操作:[将randInt(n+1)替换为在区间[0,n](含)内返回随机整数的任何函数。

  1. 定义一个位计数正好为 nunsigned int mask = (1<<n)-1; 的变量mask。这是O(1)
  2. 执行略微修改的费舍尔-耶茨洗牌版本;循环int i = 0; i<n; i++,然后在i处交换位,并在maskrndEngine::randInt(i+1)。这是O(n).
  3. return x ^ mask .这会翻转在 mask 中设置的位;这是n洗牌的位。这是O(1).

假设randInt(或其他任何东西)O(1),该操作O(n)