【发布时间】:2013-03-28 20:45:19
【问题描述】:
我正在尝试编写一个基于随机生成的指令集的简单虚拟机。在 C 中,生成包含 N 位 集的随机位掩码的最佳方法是什么(与生成随机整数不同,因为不能保证其中设置了 N 位)。我需要它同时适用于 16 位和 32 位整数。
编辑:它必须有完全 N 位设置。 完全正确。不多。而且不少。 正好设置了 N 位。它不必非常安全,也不必从宇宙噪声中获取熵。它必须是伪随机的。
这就是我真正想要实现的目标:
uint32_t rand_bits_32(size_t reqBits)
{
/* blah */
}
uint16_t rand_bits_16(size_t reqBits)
{
/* blah */
}
extern char *int2bin(uint32_t n, char *buf);
uint16_t gen_mask_16_excl_32(uint32_t* exclude, size_t exclude_count, size_t bits_required)
{
uint32_t ret = 0;
while (1) {
bool has = false;
ret = (uint32_t)rand_bits_16(bits_required);
for (size_t i = 0; i < exclude_count; i++) {
if (ret & (uint32_t)exclude[i]) {
has = true;
break;
}
}
if (!has) {
break;
}
has = false;
}
return ret;
}
uint32_t gen_mask_32(uint32_t* exclude, size_t exclude_count, size_t bits_required)
{
uint32_t ret = 0;
while (1) {
bool has = false;
ret = rand_bits_32(bits_required);
for (int i = 0; i < exclude_count; i++) {
if (ret & (uint32_t)exclude[i]) {
has = true;
break;
}
}
if (!has)
break;
has = false;
}
return ret;
}
我生成随机位,然后对现有位掩码进行暴力破解AND 直到没有位匹配,因此我可以生成具有 N 个位且没有其他位掩码共有的位的位掩码。是的,这段代码很糟糕,在 x86_64 上会中断。
【问题讨论】:
-
当你说“N bits”时,你的意思是“N bits set”吗?
-
@SteveEmmerson 好点,我完全忘记了这种可能性。
-
是的,当我说“N 位”时,我的意思是设置了 N 位。
-
你可以尝试使用加密安全的伪随机生成器,谷歌一下。
-
我不想要安全性或极端随机性。只要是随机的,我就没事。但它必须设置 N 位。不大于N且不小于N。
标签: c bit-manipulation