rand()的实现

rlb*_*ond 19 c random embedded

我在C中编写一些嵌入式代码,需要使用rand()函数.不幸的是,控制器的库不支持rand().我需要一个快速的简单实现,但更重要的是空间开销很小,产生相对高质量的随机数.有谁知道使用哪种算法或示例代码?

编辑:它用于图像处理,因此"相对高质量"意味着良好的循环长度和良好的均匀特性.

Joh*_*ook 23

查看George Marsaglia的这个随机数发生器集合.他是随机数生成方面的领先专家,所以我有信心使用他推荐的任何东西.该列表中的生成器很小,有些只需要几个无符号长整数作为状态.

按照您的长期标准和良好的均匀分布,Marsaglia的发电机绝对是"高品质".他们通过了严格的统计测试,尽管他们不会做密码学.

  • 感谢您的参考.我做了一点研究,发现[GISS Rose]的"KISS:有点过于简单"(http://eprint.iacr.org/2011/007.pdf),其中(a)警告"坏" MWC中的种子值和(b)对SHR3发生器产生怀疑.[马萨格利亚2003年的帖子](http://groups.google.com/group/sci.math/msg/9959175f66dd138f)给出了一个稍微不同的SHR3,它解决了早期的问题.我很乐意使用KISS式发电机,只要我检查并避免"坏"种子,并确保我使用更好的SHR3发电机. (2认同)
  • @Joey:Marsaglia的KISS发生器在[L'Ecuyer的`TestU01`RNG测试](http://www.iro.umontreal.ca/~lecuyer/myftp/papers/testu01.pdf)中仍然表现良好,通过测试甚至一些L'Ecuyer自己的RNG如"LFSR113"失败了. (2认同)

小智 11

C代码来自L'écuyerLFSR113:

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);
}
Run Code Online (Sandbox Code Playgroud)

质量非常高,速度快.不要使用rand()做任何事情.它比无用还糟糕.

  • 请注意,它假定为32位int,这可能不适合嵌入式平台. (3认同)