有没有更好的方法可以在固定时间内生成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 :(得分:6)
生成(0..255),然后随机播放。然后逐一给出元素。改组为O(n),对256个值进行一次,因此每个元素的成本为O(1);并且显然返回单个元素也是O(1)。
答案 1 :(得分:3)
由于数据集非常有限,因此在分配256个值时不应该出现问题,将它们混洗并按顺序提取它们,something like:
#include <stdio.h>
#include <stdint.h>
static uint8_t data[256];
static int index;
void init_random()
{
srand(NULL);
index = 0;
for (int i = 0; i < 256; ++i)
data[i] = i;
// bad choice, use fisher-yates for example
for (int i = 0; i < 10000; ++i)
{
int i1 = rand()%256, i2 = rand()%256;
uint8_t t = data[i1];
data[i1] = data[i2];
data[i2] = t;
}
}
uint8_t extract()
{
return data[index++];
}
int main(void)
{
init_random();
for (int i = 0; i < 100; ++i)
printf("%d\n", extract());
}