我有这个大的字符数组,需要用高频率随机字节填充。 我想知道是否有更快的方式,而不是天真的方式(使用for循环 – 填充每个单元格随机字节)来做到这一点。 对这些值的随机质量没有要求。 任何“随机”垃圾都可以。 平台是windows
真正的随机(仅适用于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);
取决于你是在Linux还是在Windows上,但是在Linux上从/ dev / random执行一个memcpy应该可以工作。
在Windows上,您可以使用CryptGenRandom随机数据填充缓冲区: http : //msdn.microsoft.com/zh-cn/library/aa379942.aspx 。 显然,这是从/ dev / random读取数据的Windows等价物。 Python使用它在Windows上实现其OS.urandom
函数: http : //en.wikipedia.org/wiki/CryptGenRandom
如果你的缓冲区大小可以除以4,你也许可以做类似的事情。
unsigned int v = rand(), *ptr = (unsigned int *)buf; for(int i = 0; i < buffer_size / 4; i++) ptr[i] = (v << 16) ^ rand();
只是一个主意;)
生成大量均匀分布的随机数的非常快速和简单的方法是使用梅森扭转者 。 如果速度很关键,甚至可以使用SIMD来完成。
这似乎是做你所需要的:
srandom(42); memset(ptr, random(), len);
只生成一个随机数,但数据将是“随机的”,足以让您发现许多基于未初始化内存的错误。 您可以更改种子并重新运行该程序以使用不同的数据进行测试。
如果你需要这个进行调试,你可能也想看看Valgrind 。
用前面的垃圾值设置一个缓冲区。 如果您需要再次使用随机字节填充char数组,则只需将垃圾缓冲区中的memcpy部分随机偏移到char数组,直到它被完全覆盖。 memcpy通常非常快速并经过优化,可以利用SIMD和缓存指令。 如果你复制的段足够大,那么选择随机偏移的开销如果可以忽略不计 – 你正在用memcpy的速度生成垃圾数据。
我写了一个产生“几乎随机”缓冲区的库:使用填充了伪随机随机数据的多个缓冲区,库随机选择一个缓冲区并将其返回给应用程序。
这个库首先被设计得尽可能快,因为内存消耗便宜,带宽高。
它可以用于基于块的处理:所产生的数据并不是真正的随机数,而是缓冲区呈现给应用程序的方式,所以它会产生一个足够大的随机流来击败一些压缩算法。
由于这个问题被标记为Windows / WINAPI,你可以使用CryptGenRandom 。