我正在开发一种算法,该算法需要尽快生成数百万个数字。实际上我发现算法的rand()函数占用了75%的处理时间。
所以我正在寻找更快的东西。而且我根本不需要大范围。 (我只需要1000以下的整数)
你知道我能用的东西吗?
谢谢!
编辑:
我使用这个数字来改组少于1000个实体的组。
我发现了更多关于"快速兰特"。还有SSE版本,速度更快,一次生成4个数字。
答案 0 :(得分:3)
Mersenne Twister算法是一个非常快速但平衡的伪随机数生成器。
答案 1 :(得分:3)
如果您使用的是英特尔Ivy Bridge处理器,则可以使用RDRAND指令将随机数生成卸载到硬件。
此stack overflow article讨论了RDRAND的吞吐量。
您还可以识别处理器是否支持RDRAND并使用硬件卸载,还是回退到软件实现。
答案 2 :(得分:2)
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;
}
答案 3 :(得分:1)
在大多数系统中,rand()是一个伪随机数生成器。所以代码应该只是几个移位+位操作,并且能够在典型的PC上每秒产生数百万个数字。你不会说你得到了什么,你的硬件是什么,或者你正在使用哪个C库,所以你很难明白为什么你的实施是慢的"。
也许你可以尝试重复使用位:取最低十位(= 1024个值),模数1000来获得你想要的数字范围。然后移位,当你用完比特时,再次调用rand()
以获得更多比特。