C++ 中从 -9 到 9 的随机数
只是想知道,如果我有以下代码:
int randomNum = rand() % 18 + (-9);
这会创建一个从 -9 到 9 的随机数吗?
just wondering, if I have the following code:
int randomNum = rand() % 18 + (-9);
will this create a random number from -9 to 9?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
不,不会的。您正在寻找:
-9 和 +9 之间有 19 个不同的整数(包括两者),但
rand() % 18
只给出 18 种可能性。这就是为什么您需要使用rand() % 19
。No, it won't. You're looking for:
There are 19 distinct integers between -9 and +9 (including both), but
rand() % 18
only gives 18 possibilities. This is why you need to userand() % 19
.不要忘记新的 C++11 伪随机功能,可以如果您的编译器已经支持它,那么它是一个选项。
伪代码:
Do not forget the new C++11 pseudo-random functionality, could be an option if your compiler already supports it.
Pseudo-code:
您的代码返回 (0-9 和 17-9) = (-9 和 8) 之间的数字。
请参考
返回 0 到 N-1 之间的数字:)
正确的代码是
Your code returns number between (0-9 and 17-9) = (-9 and 8).
For your information
returns number between 0 and N-1 :)
The right code is
你是对的,-9 到 9(含)之间有 18 个计数数字。
但计算机使用包含零的整数(Z 集),这使得它有 19 个数字。
从 rand() 与 RAND_MAX 获得的最小比率为 0,因此您需要减去 9 才能得到 -9。
以下信息已被弃用。它不在 aymore 的联机帮助页中。我还建议使用 现代 C++ 用于此任务。
另外,rand 函数的手册页引用:
所以在你的情况下这将是:
You are right in that there are 18 counting numbers between -9 and 9 (inclusive).
But the computer uses integers (the Z set) which includes zero, which makes it 19 numbers.
Minimum ratio you get from rand() over RAND_MAX is 0, so you need to subtract 9 to get to -9.
The information below is deprecated. It is not in manpages aymore. I also recommend using modern C++ for this task.
Also, manpage for the rand function quotes:
So in your case this would be:
每当您有疑问时,您都可以运行一个循环,使用原始算法获取 1 亿个随机数,获取最低和最高值,然后看看会发生什么。
Anytime you have doubts, you can run a loop that gets 100 million random numbers with your original algorithm, get the lowest and highest values and see what happens.