我正在用C编写一些嵌入式代码,需要使用rand()函数。不幸的是,控制器的库中不支持rand()。我需要一个简单的实现,这是快速的,但更重要的是有很小的空间开销,产生相对高质量的随机数。有人知道要使用哪种算法或示例代码吗?
编辑:它是用于图像处理的,所以“相对高质量”意味着良好的周期长度和良好的均匀属性。
发布于 2009-07-22 18:40:16
看看这篇来自George Marsaglia的collection of random number generators。他是一位领先的随机数生成专家,所以我对他推荐的任何东西都很有信心。该列表中的生成器很小,一些生成器只需要几个无符号的长整型作为state。
Marsaglia的发电机绝对是“高质量”的,按照你的标准,周期长,分布均匀。它们通过了严格的统计测试,尽管它们不适用于密码学。
发布于 2009-07-24 22:22:33
为LFSR113 from L'écuyer使用the C code
unsigned int lfsr113_Bits (void)
{
static unsigned int z1 = 12345, z2 = 12345, z3 = 12345, z4 = 12345;
unsigned int b;
b = ((z1 << 6) ^ z1) >> 13;
z1 = ((z1 & 4294967294U) << 18) ^ b;
b = ((z2 << 2) ^ z2) >> 27;
z2 = ((z2 & 4294967288U) << 2) ^ b;
b = ((z3 << 13) ^ z3) >> 21;
z3 = ((z3 & 4294967280U) << 7) ^ b;
b = ((z4 << 3) ^ z4) >> 12;
z4 = ((z4 & 4294967168U) << 13) ^ b;
return (z1 ^ z2 ^ z3 ^ z4);
}
非常高的质量和速度。不要使用rand()做任何事情。它比无用更糟糕。
发布于 2009-07-22 18:36:08
这里有一个指向ANSI implementation of a few random number generators的链接。
https://stackoverflow.com/questions/1167253
复制相似问题