在 int 中反转 n 个不同的随机位
invert n different random bits in 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?
}
我会
执行以下操作:[将randInt(n+1)
替换为在区间[0,n]
(含)内返回随机整数的任何函数。
- 定义一个位计数正好为
n
:unsigned int mask = (1<<n)-1;
的变量mask
。这是O(1)
- 执行略微修改的费舍尔-耶茨洗牌版本;循环
int i = 0; i<n; i++
,然后在i
处交换位,并在mask
中rndEngine::randInt(i+1)
。这是O(n)
. -
return x ^ mask
.这会翻转在mask
中设置的位;这是n
洗牌的位。这是O(1)
.
假设randInt
(或其他任何东西)O(1)
,该操作O(n)
。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 将字符串转换为 int 后的随机值
- 声明的 int 具有随机起始值
- 将一个随机的字符序列和int序列解析为单独的向量
- 随机打印出int的大小,不知道为什么
- 从C 到C#调用INT []显示随机大数字,而不是原始数组成员
- 尝试从类生成随机 int
- C 使用单个生成器从多个范围内提升随机INT
- 减少每次通过时的随机均匀int分布
- 为什么这个int会随机变成一个巨大的负值
- C++ Int 在不应该更改它的函数后获取随机值
- Int作为一个随机的7位组合返回
- 生成具有指定上限(0-n)的随机int,而不使用/或%
- int 和 double 的均匀随机分布"base class"?
- 将随机字符串值放入int数组中
- C++:将字符转换为 int 时获取随机负值
- 为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?
- 如何简化此代码(在无符号 int 的基础上生成最小值和最大值之间的随机 int)