C ++中最随机的函数是什么?

时间:2009-05-04 21:37:01

标签: c++ random

我用过

#include<stdlib>
#include<time>
using namespace std;
srand((unsigned)time(0));
int n=(rand()>>8)%4;

但是还有其他随机函数,或者其他函数可以用作随机数生成器?

编辑:我没有特别的理由提出这个问题,我只是想知道C ++是否还有其他随机函数。

9 个答案:

答案 0 :(得分:16)

  • Boost Random Number Library提供了广泛的生成器(质量与性能)和一些典型的随机分布。一切都比较好用,直截了当。
  • 如果你想要一些其他的方法/库 - 然后谷歌加密随机数,你也可以使用this document作为参考。
  • 除非您是该领域的专家/研究人员,否则不要发明自己的解决方案,利用通常由Smart People编写的现有解决方案,并由其他智能人员进行彻底检查。

答案 1 :(得分:14)

rand()和srand()函数都是C ++ Standard指定的。如果要写自己的,请注意John von Neumann说的话:

  

“任何考虑算术的人   产生随机数字的方法是   当然是处于罪恶的状态“

答案 2 :(得分:14)

此代码非常有效。虽然用户可能会在几次迭代后开始注意到模式。

int FastRandom()
{
  return 10;
}

答案 3 :(得分:5)

不是严格的C ++,而是Windows特定的:

CryptGenRandom

我确信所有操作系统都具有等效的加密安全随机生成器功能。

答案 4 :(得分:2)

int unixrand()
{
   int x;
   int f = open("/dev/random", O_RDONLY);
   if (f < 0) return -1; /* Error */
   if (sizeof(x) != read(f, &x, sizeof(x))) {
       close(f);
       return -1;
   }
   close(f);       
   if (x < 0) x = ~x;
   return x;
}

答案 5 :(得分:1)

(从answer I just wrote交叉发布到类似问题)

查看ISAAC(间接,移位,累积,添加和计数)。它均匀分布,平均周期长度为2 ^ 8295。

它也很快,因为它不涉及乘法或模数。

答案 6 :(得分:0)

Bruce Schneier和John Kelsey写了a random number generator你可能感兴趣的。相反,它是种子生成器。即使Yarrow不再受支持,您可能会对它如何收集熵感兴趣。

OpenSSL has an API相对容易访问且非常便携。 Mozilla附带a decent API that wraps whatever the OS offers

但就个人而言,我通常使用Boost.Random,已经提出过。

答案 7 :(得分:-2)

随机性为您提供了均匀分布的良好随机数,并且做得非常好。

其他任何事情都意味着您希望实际扭曲分布。

例如,使用Microsoft的GUID生成器会为您提供一个不太可能重复的随机ID,并考虑时间和计算机等内容。

答案 8 :(得分:-4)

时间通常是最随机的操作,执行起来也很便宜,但它仍然可以预测。

如果您想要真正的随机性,使用某种外部输入是您唯一的解决方案。

Quantum Random Bit Generator是一种提供此类数据的服务。