有没有更好的方法来生成8位唯一和随机号码在恒定时间?生成8位唯一随机数
以下实现返回8位唯一随机数,但复杂度为O(n = 256),因为它必须遍历is_generated
[]数组,直到它生成一个先前未生成的数组。另外它需要额外的空间is_generated
。
uint8_t
random_octate(void)
{
static bool is_generated[256] = {false};
uint32_t num = rand()%256;
while(is_generated[num])
{
num = rand() % 256;
}
is_generated[num] = true;
return num;
}
预洗牌值[0..255]用Fisher检验Yates是一个很好的答案,因为已经给出。我会补充说你的问题被打破了。保证不重复的256个数字不是随机的。它们是[0..255]的随机排列,这正是Fates-Yates所产生的。 – Gene