win32 - 更高的随机最大值?

时间:2011-01-28 20:56:23

标签: c++ visual-studio winapi random

  

可能重复:
  Filling an array with random numbers from 1 to 10^10 in C or C++

您好,

简单的问题;我正在寻找一种方法来获得比rand()给我更高的随机值。 rand()给出最大32767。 (http://msdn.microsoft.com/en-us/library/398ax69y%28v=vs.80%29.aspx) 我已经尝试重新定义RAND_MAX,但我想编译器不接受重新定义,因为它与默认值在同一边界内。

我基本上想要一个适合无符号整数的随机值(在RTP数据包中生成一个SSRC号)。我真的不想碰撞! 有没有比rand()更好的win32功能?

提前致谢

4 个答案:

答案 0 :(得分:6)

是的 - RAND_MAX只是告诉你设计到发电机的最大值。更改它不会影响发电机的工作方式。

从中获取32位值的最简单方法可能是连续两次调用rand(),并将这两个值放在一起:

无符号SSRC = rand()|兰德<< 16;

播种rand()的一种典型方法是使用time

srand((unsigned)time(NULL));

对于SSRC,你想要这样做 - time通常只有一秒钟的粒度,所以这(几乎)保证任何两个进程开始接近同时会导致碰撞。

实际上,随机性几乎与唯一性无关。另一种可能性是(例如)将机器的IP地址,进程ID,时间和XOR三者结合在一起。结果并不是特别随机,但对于这种任务来说是非常独特的。

答案 1 :(得分:3)

使用Boost.Random(如果您有VC ++ 2010,也可以<random>使用)。请注意,这将在不久的将来成为C ++标准的内置部分。

Boost网站上有一些很好的例子,包括Generating integers in a range

答案 2 :(得分:1)

rand()&lt;&lt; 15&rand()怎么样?它可以是你想要的大。

答案 3 :(得分:1)

更改RAND_MAX不会改变{C}运行时中定义的rand()函数的行为;它只是一个方便的宏,让您了解rand()生成的输出范围。

如果您想要适合加密的高质量随机数,请使用CryptGenRandom;请参阅社区内容下方底部的完整示例,了解如何使用它。