比rand()更快?

我正在研究一种算法,它需要尽可能快地生成数百万个数字。 实际上我发现算法的rand()函数占用了75%的处理时间。

所以我正在寻找更快的东西。 而且我根本不需要大范围。 (我只需要1000以下的整数)

你知道我能用的东西吗?

谢谢 !

编辑:

我使用这个数字来改组少于1000个实体的组。

我发现了更多关于“快速兰特”的信息。 还有SSE版本,速度更快,一次生成4个数字。

https://software.intel.com/en-us/articles/fast-random-number-generator-on-the-intel-pentiumr-4-processor/

 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; } 

Mersenne Twister算法是一种非常快速且平衡的伪随机数生成器。

以下是一个示例实现: http : //fmg-www.cs.ucla.edu/geoff/mtwist.html

在大多数系统中,rand()是伪随机数生成器。 所以代码应该只是几个移位+位操作,并且能够在典型的PC上每秒产生数百万个数字。 你没有说你得到了什么,你的硬件是什么,或者你正在使用哪个C库,所以很难看出你的实现为什么“慢”。

也许你可以尝试重用位:取最低十位(= 1024个值),模数1000来获得你想要的数字范围。 然后移位,当你用完比特时,再次调用rand()获取更多位。

如果您使用的是英特尔Ivy Bridge处理器,则可以使用RDRAND指令将随机数生成卸载到硬件。

这篇堆栈溢出文章讨论了RDRAND的吞吐量。

您还可以确定处理器是否支持RDRAND并使用硬件卸载还是回退到软件实现。