为什么我的rand()产生负数?

时间:2017-02-02 02:56:58

标签: c++ c++11

在尝试在n和n ^ 2之间创建一个随机数时,我有这段代码,不知怎的,它有时产生一个负数。我已经检查了rand()time(NULL),并且它们都产生了正数,那么它怎么可能产生一个负数呢?

我想要生成许多数字来存储到数组中,但不知何故只有前几个数字是负数。

int randomNum = (((rand()*time(NULL))%(n*n-n))+n);

3 个答案:

答案 0 :(得分:4)

整数溢出。 time(NULL)目前返回的值约为14.9亿。乘以rand()几乎会在rand()的任何值上溢出,并且在大约一半的时间内会产生负值。

不要乘以time(NULL)。这里没有用处。只需使用rand()

答案 1 :(得分:0)

你要做的是种子随机数生成器一次的时间

srand(time(NULL));

在此之后,调用函数而不涉及时间

int randomNum = ((rand()%(n*n-n))+n);

重复播种随机数生成器是一个坏主意,特别是随着时间的推移。在c ++ 11中,有更好的方法可以使用std::random

答案 2 :(得分:0)

我想添加answer给出的Raziman T V。如果你用C ++ 11编写,那么我强烈建议使用新的'generator'和'distributions'。 'Generators'替换'rand()'并允许生成均匀分布的伪随机数(如'rand()')。 '分布'根据给定的分布(uniform,normal,Weibull等)转换生成的数字序列。可以找到更多信息here
以下是如何生成范围内的伪随机数的示例[10; 20]:

#include <chrono>
#include <random>

....
const size_t Min = 10, Max = 20;
size_t seed = std::chrono::system_clock::now().time_since_epoch().count();

// Similarly to srand(time(NULL))
std::mt19937_64 generator(seed); 
//uniform distribution from 10 to 20
std::uniform_int_distribution<size_t> distribution(Min, Max); 

//Similarly to rand ()
size_t random = distribution(generator);

主要优点是您可以使用任意数量的生成器(使用不同的种子初始化)和分布来生成不同的伪随机序列。使用'rand()'同时很难生成两个不同的序列。