[英]Why is the range of rand() smaller than that of int?
我正在尝试用5000个随机数填充向量。 每个数字都是整数。 但是我想知道为什么rand()只给出正整数,为什么它从不给出整数可以容纳的最大值。 有什么理由吗?
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
unsigned seed = time(0);
srand(seed);
vector<int> vect(5000);
for (int i = 0; i < vect.size(); i++)
{
vect[i] = rand();
}
return 0;
}
这是rand()
作用:
返回介于
0
和RAND_MAX
之间的伪随机整数值(包括0
和RAND_MAX
)。
RAND_MAX
是实现定义的,但将为“至少32767”。
除了“这是如何指定”之外没有其他“为什么”。
如果要包含一个负数的范围,则可以应用一些数学运算(例如,减法)。
注意事项:
不建议将
rand()
用于严重的随机数生成需求。 建议使用C ++ 11的随机数生成工具来替换rand()
。 (自C ++ 11起)
所述设施为您提供了更好的控制和更好的分配( 示例 )。
为什么你没有得到完整的可能范围的原因是rand()
是古。
早在rand()
开发时,实现随机数生成器的常用方法就是所谓的线性同余生成器(lcg)。 这不会给出非常随机的数字。 实际上,如果您看过前几个,它们是可以预见的。 但是,当时的计算机运行缓慢,只能处理少量数据。
这就是rand()
仅承诺15位的原因-常量RAND_MAX
定义了您可以从RAND
获得的最大值,并且该值可以低至32767
。 那时的32位计算机并不常见,因此使用16位数字是合理的。 对于常见的LCG实现,最低位是毫无价值的(在0和1之间切换),因此无论如何您都希望将其丢弃。
几十年来的改进已使发电机更好了。 特别是, mt19937
生成器非常好,但仍然非常高效。 自2011年以来,C ++具有<random>
,其中包括std::mt19937
。 另外,为方便起见,您现在可以使用std::uniform_int_distribution<>(min,max)
选择自己的分布
如前所述,不建议使用rand()
,并且切勿在实际情况下使用它。 但是要回答关于为什么只使用正整数的问题,这是因为生成负随机整数是多余的,因此您可以使用基本数学从生成的正随机数中生成负数。
举个例子:如果我想产生一个介于-5和27之间的完全随机的随机数,我可以产生一个介于0和32(含)之间的随机数,然后减去5。
#include <stdio.h>
#include <stdlib.h>
int main(){
int random = (rand() % 33) - 5;
printf("%d",random);
return 0;
}
因为这不是实际情况,所以我也没有植入随机数。 因此,您不应该在代码中使用此功能,但是它几乎适用于任何RNG函数,您只需从正值中减去负值范围即可。 但是,您应该使用C ++ 11随机数生成器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.