对于一个我目前正在做的项目,我需要尽可能快地生成大量的伪随机浮点数,在0到1之间,在几千到几十万的范围内。
最好的方法是什么?
目前我能想到的选择是:
Crand()
,根据我的经验,速度相当快。
C++11随机,相当慢,但更好的随机数,从我所听到的。
自定义散列函数,例如:
u_int32_t seed = 1;
seed = (seed ^ 61) ^ (seed >> 16);
seed = seed + (seed << 3);
seed = seed ^ (seed >> 4);
seed = seed * 0x27d4eb2d;
seed = seed ^ (seed >> 15);
uint8_t a = seed&0xff;
float n = (((float)a)/UINT8_MAX);
这是相当快的。
以上速度测试:
Generating 100000 Random Numbers
C rand(): 1.72661
C++ random: 6.60626
hash random: 1.034
有没有更快的选择? 我唯一能想到的是一些更快的散列或者通过一个电脑着色器在GPU上做它,但是我在这方面没有太多的经验。
任何帮助都不胜感激。
最好的方法是什么?
取决于速度之外的其他要求。 序列需要可重复性吗? 随机性的统计质量重要吗? 分布是否需要均匀? 你将使用什么处理器来执行程序?
如果速度是唯一的考虑因素,那么最快的解决方案是返回0.0
,尽管分布相当偏颇。
但更严重的是,如果统计质量至少有一点重要,那么恒定值还不够,但仍然远远低于速度,那么选择生成器的最佳方法就是对已知算法进行基准测试,并选择目标系统上最快的算法。
包括一些生成器,其中一些相当简单和快速。