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