在尝试在n和n ^ 2之间创建一个随机数时,我有这段代码,不知怎的,它有时产生一个负数。我已经检查了rand()
和time(NULL)
,并且它们都产生了正数,那么它怎么可能产生一个负数呢?
我想要生成许多数字来存储到数组中,但不知何故只有前几个数字是负数。
int randomNum = (((rand()*time(NULL))%(n*n-n))+n);
答案 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()'同时很难生成两个不同的序列。