为什么我的 rand() 会产生负数
Why does my rand() produce a negative number?
我在尝试创建 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()'同时生成两个不同的序列。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么我的for循环不能正确获取argv
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 0-1背包代码中的错误.我的代码中有什么错误
- 当我的阵列太大时出现分段错误
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么 rand 不在我的代码中生成随机数?
- 为什么 rand() 给我的数字超出了我定义的间隔?(昨天工作正常)
- 为什么我的 rand() 会产生负数
- 输出在我的字符数组范围之外,同时使用 rand()
- 为什么我的 rand() 数字显示为 0
- rand() 即使在我的 Mac 上播种时也会给出序列号
- rand() 返回的 int 比我的最大 C++ 高
- rand%以可预测的模式生成我的所有实体