只是想知道,如果我有以下代码:
int randomNum = rand() % 18 + (-9);
这会创建一个从-9到9的随机数吗?
答案 0 :(得分:29)
不,它不会。你在寻找:
int randomNum = rand() % 19 + (-9);
-9和+9之间有19个不同的整数(包括两者),但rand() % 18
只提供18种可能性。这就是您需要使用rand() % 19
。
答案 1 :(得分:7)
您的代码返回介于(0-9和17-9)=( - 9和8)之间的数字。
供您参考
rand() % N;
返回介于0和N-1之间的数字:)
正确的代码是
rand() % 19 + (-9);
答案 2 :(得分:6)
不要忘记新的C++11 pseudo-random functionality,如果您的编译器已经支持它,可以选择它。
的伪代码:
std::mt19937 gen(someSeed);
std::uniform_int_distribution<int> dis(-9, 9);
int myNumber = dis(gen)
答案 3 :(得分:3)
你是对的,在-9和9(含)之间有18个计数数字。
但是计算机使用整数(Z集),其中包括零,这使得它成为19个数字。
你从rand()获得的最小比率超过RAND_MAX是0,所以你需要减去9来得到-9。
另外,manpage for the rand function引用:
“如果要生成1到10之间的随机整数,则应始终使用高位来执行此操作,如
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
并且永远不会有类似的东西
j = 1 + (rand() % 10);
(使用低位)。“
所以在你的情况下,这将是:
int n= -9+ int((2* 9+ 1)* 1.* rand()/ (RAND_MAX+ 1.));
答案 4 :(得分:0)
任何时候你都有疑问,你可以运行一个循环,用原始算法获得1亿个随机数,得到最低和最高值,看看会发生什么。