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

Why does my rand() produce a negative number?

本文关键字:我的 rand 为什么      更新时间:2023-10-16

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

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

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

溢出。 time(NULL)目前返回的价值约为 14.9 亿。将其乘以rand()将溢出几乎任何rand()值,并且大约一半的时间会导致负值。

不要乘以time(NULL).它在这里没有任何用处。只需使用rand().

您要做的是用时间播种一次随机数生成器

srand(time(NULL));

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

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

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

我想

补充一下Raziman T V给出的答案。如果你写的是C++11,那么我强烈建议使用新的"生成器"和"发行版"。 "生成器"取代了"rand()",并允许生成均匀分布的伪随机数(如"rand()")。"分布"根据给定分布(均匀分布、正态分布、威布尔分布等)转换生成的数字序列。更多信息可以在这里找到。
下面是如何在 [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()'同时生成两个不同的序列。