可能重复:
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功能?
提前致谢
答案 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
;请参阅社区内容下方底部的完整示例,了解如何使用它。