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

时间:2015-03-08 00:49:13

标签: c++ math random bit

如何有效地反转unsigned int 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?
}

1 个答案:

答案 0 :(得分:2)

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

  1. 定义一个变量mask,其位数完全为nunsigned int mask = (1<<n)-1;。这是O(1)
  2. 执行Fisher-Yates Shuffle的略微修改版本;循环int i = 0; i<n; i++,然后在i中的rndEngine::randInt(i+1)mask处交换位。这是O(n)
  3. return x ^ mask。这会翻转mask中设置的位;这是n洗牌的比特。这是O(1)
  4. 操作为O(n),假设randInt(或其他)为O(1)