我正在尝试编写一个基于随机生成的指令集的简单虚拟机。在 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 上会中断。