提问者:小点点

C++快速生成大量随机浮点数(10,000+个数字)


对于一个我目前正在做的项目,我需要尽可能快地生成大量的伪随机浮点数,在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上做它,但是我在这方面没有太多的经验。

任何帮助都不胜感激。


共1个答案

匿名用户

最好的方法是什么?

取决于速度之外的其他要求。 序列需要可重复性吗? 随机性的统计质量重要吗? 分布是否需要均匀? 你将使用什么处理器来执行程序?

如果速度是唯一的考虑因素,那么最快的解决方案是返回0.0,尽管分布相当偏颇。

但更严重的是,如果统计质量至少有一点重要,那么恒定值还不够,但仍然远远低于速度,那么选择生成器的最佳方法就是对已知算法进行基准测试,并选择目标系统上最快的算法。 包括一些生成器,其中一些相当简单和快速。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|快速|生成|随机|浮点数|10|000|数字)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?