C/C++快速生成伪随机数(一行代码即可)

计算机不能(或很难)生成真随机数,在实际应用中使用的是伪随机数。为了避免生成的“随机数”形成一样的模式,可以使用随机数种子来重新排列序列。例如:

现代的伪随机数算法已经可以很好的生成“随机数”,但是,它好像有一点点慢。例如你想要生成1百万随机数,并且整个系统的性能依赖于随机数生成的效率。
XorShift伪随机生成器也许是一个很好的选择,XorShift算法执行的更快并且使用更少的内存。它的原理是基于异或、移位操作的不可逆。代码如下:

很明显,上面的代码执行速度很快(使用异或和移位运算),但是我们怎么测试它的生成结果是不是“随机数”呢?我们可以用随机数生成bmp图片,看一看有没有规律可循,就可以知道生成随机数好不好。

C++有一个C++ BMP 库,可以生成BMP文件。代码如下:

上面代码生成随机的图片:

Screen Shot 2015-12-06 at 9.23.09 AM

标准库的rand()函数生成的图片如下:

Screen Shot 2015-12-06 at 9.33.07 AM

XorShift生成伪随机数的算法满足随机要求,并且在生成速度上有一定优势。

一行代码生成伪随机数:

n是unsigned32位的seed,每次迭代,生成的随机数n再次做为seed。这里把n的溢出充当为模操作。参考:knuth-multiplicative-hash。在无关紧要的场景下可以使用这个方法。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注