c ++:用随机字节填充缓冲区的最快方法

时间:2011-09-15 08:19:26

标签: c++ windows winapi

我有一个需要在高频率中填充随机字节的大字符数组。我想知道除了天真的方式(使用for循环 - 用随机字节填充每个单元格)之外是否有更快的方法来执行此操作。对值的随机质量没有要求。任何“随机”垃圾都可以。平台是windows

8 个答案:

答案 0 :(得分:18)

真随机(仅限Unix):

int fd = open("/dev/random", O_RDONLY);
read(fd, your_buffer, buffer_size);

不完全随机(仅限Unix):

int fd = open("/dev/urandom", O_RDONLY);
read(fd, your_buffer, buffer_size);

常量随机(除非您使用srand(time(NULL)),可移植):

for(size_t i = 0; i < buffer_size; i++)
    your_buffer[i] = rand() % 256;

或类似的东西:

memcpy(your_buffer, (void*)memcpy, buffer_size);

答案 1 :(得分:3)

取决于你是在Linux或Windows上,但是在Linux上做/ dev / random的memcpy应该可以工作。

在Windows上,您可以使用CryptGenRandom使用随机数据填充缓冲区:http://msdn.microsoft.com/en-us/library/aa379942.aspx。 显然这是Windows等同于从/ dev / random读取数据。 Python使用它在Windows上实现其OS.urandom函数:http://en.wikipedia.org/wiki/CryptGenRandom

答案 2 :(得分:1)

如果你的缓冲区大小可以除以4,你可能会做类似的事情。

unsigned int v = rand(), *ptr = (unsigned int *)buf;
for(int i = 0; i < buffer_size / 4; i++)
    ptr[i] = (v << 16) ^ rand();

只是一个想法;)

答案 3 :(得分:0)

生成大量均匀分布的随机数的快速而简单的方法是使用Mersenne twister。如果速度至关重要,甚至可以使用SIMD完成。

答案 4 :(得分:0)

这似乎可以满足您的需求:

srandom(42);
memset(ptr, random(), len);

只生成一个随机数,但数据将“随机”足以让您根据未初始化的内存发现大量错误。您可以更改种子并重新运行程序以使用不同的数据进行测试。

如果您需要进行调试,可能还需要查看Valgrind

答案 5 :(得分:0)

设置一个前面有垃圾值的缓冲区。如果你需要再次使用随机字节填充char数组,那么只需将垃圾缓冲区中的部分随机偏移到char数组,直到它被完全覆盖。 memcpy通常非常快速并且经过优化以利用SIMD和缓存指令。如果你正在复制足够大的段,那么选择随机偏移的开销如果可以忽略不计 - 你将以memcpy的速度生成垃圾数据。

答案 6 :(得分:0)

由于此问题标记为windows / winapi,因此您可以使用CryptGenRandom

答案 7 :(得分:0)

我编写了一个产生“几乎随机”缓冲区的库:使用多个填充了伪随机随机数据的缓冲区,库随机选择一个缓冲区并将其返回给应用程序。

该库首先设计为尽可能快,因为内存消耗便宜且带宽高。

它可以用于基于块的处理:产生的数据不是真正随机的,而是缓冲区呈现给应用程序的方式,因此它生成一个足够大的随机流来击败某些压缩算法。 / p>

您可以在https://gitorious.org/randbuf/

找到它