C随机数生成(纯C代码,无库或函数)

我需要在C中生成一些随机数来测试和调试系统。 该系统是一个定制硬件(SoC),具有有限的function集,因此我只能使用基本的数学运算。

不,我不能在stdlib或math.h中使用随机数生成器。 我需要自己写。 那么是否有某种生成随机数的算法?

我知道一个简单的解决方案是在我的工作站上生成数字并将它们嵌入到模块中,但我不想这样做。

随机数生成器基本上是一个特殊的*散列函数,它从起始种子递归运行。

我在我的C#代码中使用了MurmurHash2算法 ,效果很好。 它实现起来非常快速和简单,经过测试,分布均匀,碰撞率低。 该项目有几个不同的开源哈希函数,用C ++编写,应该可以很容易地转换为C.


*特殊意思是我在一个值上运行哈希函数应该返回另一个看似随机(但确定)的值,这样输出似乎不会形成模式。 此外,返回值的分布应该具有均匀分布。

线性同余生成器很容易实现。 这里有一个很好的纯C实现。

在10月88日的CACM期刊中,只需挖掘Park和Miller的文章。

他们提出的一般算法是:

a = 16807; m = 2147483647; seed = (a * seed) mod m; random = seed / m; 

虽然这篇文章包含了几个改进。

您可以尝试使用 George Marsaglia的Multiply-with-carry 。

来自维基百科的代码:

 #include  #define PHI 0x9e3779b9 static uint32_t Q[4096], c = 362436; void init_rand(uint32_t x) { int i; Q[0] = x; Q[1] = x + PHI; Q[2] = x + PHI + PHI; for (i = 3; i < 4096; i++) Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i; } uint32_t rand_cmwc(void) { uint64_t t, a = 18782LL; static uint32_t i = 4095; uint32_t x, r = 0xfffffffe; i = (i + 1) & 4095; t = a * Q[i] + c; c = (t >> 32); x = t + c; if (x < c) { x++; c++; } return (Q[i] = r - x); } 

检查gsl库的源代码,在其中实现了几个经过良好测试的算法。

你可能想找Mersenne Twister。 有许多更高质量的算法。 这是一篇很好的文章,你可以在这里找到它:

http://en.wikipedia.org/wiki/Pseudorandom_number_generator

您可以尝试Isaac ,这也是CCAN的一部分