我正在研究一种需要尽可能快地生成数百万个数字的算法。实际上我发现我的算法的rand()函数占用了75%的处理时间。比rand()更快?
所以我正在寻找更快的东西。而且我根本不需要很大的范围。 (我只需要低于1000的整数)
你知道我可以使用的东西吗?
谢谢!
编辑:
我使用这个数字来混洗少于1000个实体的组。
我发现更多关于“快速兰特”。还有更快的SSE版本版本,一次生成4个数字。
我正在研究一种需要尽可能快地生成数百万个数字的算法。实际上我发现我的算法的rand()函数占用了75%的处理时间。比rand()更快?
所以我正在寻找更快的东西。而且我根本不需要很大的范围。 (我只需要低于1000的整数)
你知道我可以使用的东西吗?
谢谢!
编辑:
我使用这个数字来混洗少于1000个实体的组。
我发现更多关于“快速兰特”。还有更快的SSE版本版本,一次生成4个数字。
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;
}
你从哪里得知它比Kevin的机器具有的'rand()'实现更快? – 2014-10-07 13:58:07
我刚刚测试过它:1亿1千万个数字需要1.2s,rand()需要5s。 我将不得不检查它是否真的是随机的,但谢谢! – 2014-10-07 14:06:12
它比rand()更快一些。有一些角落案件,但没有那么重要。 @JensGustedt和我的荣幸kevinP – Asis 2014-10-07 14:16:19
Mersenne Twister算法是一个相当快而不失平衡的伪随机数发生器。
在大多数系统中,rand()是一个伪随机数生成器。我想知道他的实现实际上有多慢。 – 2014-10-07 13:43:52
我想他们并没有改变默认实现,因为它会破坏预先播种的软件...... – blue112 2014-10-07 13:46:18
在大多数系统中,兰特()是一个伪随机数发生器。因此,代码应该只是一些移位+位或操作,并且能够在典型的PC上每秒产生数百万个数字。你不会说你得到了什么,你的硬件是什么,或者你正在使用哪个C库,所以很难看出你的实现为什么“很慢”。也许你可以尝试重用位:取最低的10位(= 1024个值),以1000为模取得你想要的数字范围。然后移位,当你用尽比特时,再次拨打rand()
获取更多比特。
我不确定这是否是一个好主意,重新使用位可能不能保证最可能的线性他正在使用的全等方法。 – 2014-10-07 13:51:04
如果您正在使用英特尔Ivy Bridge处理器,可以很好地使用RDRAND指令卸载随机数生成硬件。
这stack overflow article谈论RDRAND的吞吐量。
您还可以确定处理器是否支持RDRAND并使用硬件卸载或者回退到软件实现。
3秒的75%并不多。通常,'rand()'非常快。您的代码需要多长时间才能创建100万个数字? – 2014-10-07 13:42:20
不要认为75%是“慢”。毕竟,即使运行在纳秒,*东西*将占用100%的时间。如果程序主要除了生成随机数字之外什么都不做,你会期望占用大部分时间。但是,如果您希望速度更快,那会告诉您在哪里寻找。 – 2014-10-07 13:47:02
我并不是说它“很慢”,但如果我想改进我的算法,这可能是我应该开始的地方。 – 2014-10-07 13:50:27