生成8位唯一随机数

时间:2015-10-19 01:23:09

标签: c algorithm random data-structures

有没有更好的方法可以在固定时间内生成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;
}

2 个答案:

答案 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());
}