最简单的随机数发生器没有C库?

我需要在Cortex M0 CPU固件中添加一些随机化。 随机性并不重要,但速度是。

我测试了我在网上发现的两个function。 使用random()我设法每31个时钟周期生成1个数字,而random_uint()在20个周期内生成1个数字。 我的目标是小于10.我可以使用其他function吗?

 unsigned random() { unsigned b; b = t1 ^ (t1 >> 2) ^ (t1 >> 6) ^ (t1 >> 7); t1 = (t1 >> 1) | (~b << 31); b = (t2 << 1) ^ (t2 << 2) ^ (t1 << 3) ^ (t2 << 4); t2 = (t2 <> 31); return t1 ^ t2; } unsigned random_uint() { m_z = 36969 * (m_z & 65535) + (m_z >> 16); m_w = 18000 * (m_w & 65535) + (m_w >> 16); return (m_z << 16) + m_w; } 

嗯,我相信它是32位架构,最快可能是LCG RNG 。 使用来自Numerical Recipes的值,周期为2 32

 inline uint32_t random_u32(uint32_t prev) { return prev*1664525U + 1013904223U; // assuming complement-2 integers and non-signaling overflow } int main() { auto seed = 1U; uint32_t = result; result = seed = random_u32(seed); result = seed = random_u32(seed); result = seed = random_u32(seed); ... return 0; } 

实际上,即使是更简单的版本,但周期更短,在C ++中使用的是 – 11 minstd,2 31 -1 period。

 inline uint32_t random_u32(uint32_t prev) { return prev*48271U; } 

种子不应该是0,从一些奇数开始,如134775813U

 static unsigned int g_seed; // Used to seed the generator. inline void fast_srand(int seed) { g_seed = seed; } // Compute a pseudorandom integer. // Output value in range [0, 32767] inline int fast_rand(void) { g_seed = (214013*g_seed+2531011); return (g_seed>>16)&0x7FFF; } 

从这里: 比兰德()更快?

一些最快的发电机来自George Marsaglia发现的Xorshift系列,它是PRNG设计和PRNG测试的杰出贡献者。 Xorshift链接包含示例代码。 给出的实现使用三个class次和三个XOR,每个应该花费一个周期并且很难被击败。