C++ win32-更高的随机最大值?

C++ win32-更高的随机最大值?,c++,visual-studio,winapi,random,C++,Visual Studio,Winapi,Random,可能重复: 你好, 简单问题;我正在寻找一种比rand()给出的随机值更高的方法。rand()的最大值为32767() 我尝试过重新定义RAND_MAX,但我猜编译器不接受重新定义,因为它与默认值在同一边界内 我基本上想要一个适合无符号整数的随机值(在RTP数据包中生成一个SSRC号)。我真的不想要碰撞! 有比rand()更好的win32函数吗 提前感谢是的——RAND_MAX只是告诉您发电机设计的最大值。更改它不会影响发电机的工作方式 从中获取32位值的最简单方法可能是连续调用两次rand(

可能重复:

你好,

简单问题;我正在寻找一种比rand()给出的随机值更高的方法。rand()的最大值为32767() 我尝试过重新定义RAND_MAX,但我猜编译器不接受重新定义,因为它与默认值在同一边界内

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

提前感谢

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

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

unsigned SSRC=rand()| rand是--rand_MAX只是告诉您生成器中设计的最大值。更改它不会影响发电机的工作方式

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


unsigned SSRC=rand()| rand使用
Boost.Random
(如果您有VC++2010,也可以使用
)。注意,这将成为C++标准的一个内置部分。
Boost站点上有一些很好的例子,包括。

使用
Boost.Random
(如果您有VC++2010,也可以使用
)。注意,这将成为C++标准的一个内置部分。
Boost站点上有一些很好的例子,包括。

关于rand()关于rand()改变
rand_MAX
不会改变
rand()
函数的行为,它是在C运行时中定义的;这只是一个方便的宏,您可以知道
rand()
产生的输出范围


如果您想要高质量的随机数适合用于加密,请使用;有关如何使用社区内容,请参阅底部的完整示例。

更改
RAND_MAX
不会更改
RAND()
函数的行为,该函数在C运行时中定义;这只是一个方便的宏,您可以知道
rand()
产生的输出范围


如果您想要高质量的随机数适合用于加密,请使用;有关如何使用社区内容,请参阅底部的完整示例。

这将使两个位始终为零(因为C RNG生成的最小值为15位,两次调用只会产生30位,而不是32位)。@Ben:这是非常正确的,但很少相关。如果你真的认为这是一个问题,你可以用三个调用来代替
rand
,但我怀疑你这样做会有多大收获。@Jerry Coffin:总是为特定位生成相同值的“随机数生成器”不是随机数生成器,这是个笑话。如果你想用rand()生成32(甚至31)个随机位,你必须调用它三次。@TonyK:关键是对于一个SSRC,你根本不需要很大程度的随机性。对于rand()| rand(),两个位总是为零(因为C RNG生成的最小值为15位,所以调用它两次只能产生30位,而不是32位)@Ben:没错——但很少有关系。如果你真的认为这是个问题,你可以用三次调用
rand
,但我怀疑这样做会有多大好处。@Jerry Coffin:总是为特定位生成相同值的“随机数生成器”不是随机数生成器,这是个笑话。如果你想使用rand()要生成32个(甚至只有31个)随机位,你必须调用它三次。@TonyK:关键是对于SSRC,你根本不需要很大程度的随机性。对于rand()| rand()std::random?你能将最大值设置为random吗?是的。(从技术上讲,我应该说
,因为类名更像
std::mt19937
std::uniform\u int
)您可以选择随机生成器。例如,
mt19937
生成范围为[0,(2^32)-1]的整数。您可以根据需要限制此范围,并使用
uniform\u int
,确保生成的随机数均匀分布在所需范围内。std::random?是否可以将max number设置为random?是。(从技术上讲,我应该说
,因为类名更像
std::mt19937
std::uniform\u int
)您可以选择随机生成器。例如,
mt19937
生成范围为[0,(2^32)-1]的整数。您可以根据需要限制此范围,并使用
uniform\u int
,确保生成的随机数均匀分布在所需范围内。
srand((unsigned)time(NULL));