C++ C+中从-9到9的随机数+;

C++ C+中从-9到9的随机数+;,c++,random,numbers,C++,Random,Numbers,只是想知道,我是否有以下代码: int randomNum = rand() % 18 + (-9); 这会产生一个从-9到9的随机数吗?不,不会。您正在寻找: int randomNum = rand() % 19 + (-9); 在-9和+9之间(包括两者)有19个不同的整数,但rand()%18仅给出18种可能性。这就是为什么您需要使用rand()%19您的代码返回的数字介于(0-9和17-9)=(-9和8)之间 供参考 rand() % N; 返回介于0和N-1之间的数字:) 正

只是想知道,我是否有以下代码:

int randomNum = rand() % 18 + (-9);

这会产生一个从-9到9的随机数吗?

不,不会。您正在寻找:

int randomNum = rand() % 19 + (-9);

在-9和+9之间(包括两者)有19个不同的整数,但
rand()%18
仅给出18种可能性。这就是为什么您需要使用
rand()%19
您的代码返回的数字介于(0-9和17-9)=(-9和8)之间

供参考

 rand() % N;
返回介于0和N-1之间的数字:)

正确的代码是

rand() % 19 + (-9);

你是对的,在-9和9(含9)之间有18个计数数字

但是计算机使用整数(Z集),其中包括零,这使它成为19个数字

rand()与rand_MAX的最小比值是0,所以需要减去9才能得到-9

以下信息已弃用。它不在手册页aymore中。我还建议使用。 此外,引述:

“如果要生成1到10之间的随机整数,应始终使用高阶位,如中所示

而且从来没有做过类似的事情

j = 1 + (rand() % 10);
(它使用低阶位)。”

因此,在您的情况下,这将是:

int n= -9+ int((2* 9+ 1)* 1.* rand()/ (RAND_MAX+ 1.));
不要忘记新的,如果您的编译器已经支持它,它可能是一个选项

伪代码:

std::mt19937 gen(someSeed);
std::uniform_int_distribution<int> dis(-9, 9);
int myNumber = dis(gen)
std::mt19937-gen(someSeed);
标准:均匀分布分布图(-9,9);
int myNumber=dis(gen)

任何时候你有疑问,你可以运行一个循环,用你原来的算法得到1亿个随机数,得到最低和最高的值,然后看看会发生什么。

@Danny:看看扩展的答案。它基于这样一个假设,即您希望-9和+9都是范围的一部分。如果您没有,请澄清您的要求。@Danny:因为
rand()%19
总是小于19,所以最大值可以是18,18-9是9.9个负数,9个正数,0=19。从-9到+9大声数数,然后检查一下。顺便说一句,为什么要加负9?为什么不直接减去9呢?当然,编译器无论如何都会这样做,但在我看来,这是不对的(ymmv)。使用
rand()%number\u of_distinct\u值+first\u值是一种常见模式。如果你这样想,它看起来是对的。关于用
rand()生成随机数的有趣事实实际上,这个问题或多或少是历史性的。但是rand()func和它的其他数学运算还有其他问题,比如13个numbres出现其他6个数字的几率稍高一些。如果可能,使用C++11中的新随机生成器函数(或boost替代函数),这是非常有限的调试。如果他的代码会以某种方式产生2的步骤,max和min可能是正确的,但发行版不会。事实上,这只有在你画一些历史图的时候才有意义。你在说什么?他的代码是
rand()%18+(-9)
它如何生成2的步骤?他不确定边界,而不是分布。我说的是你的测试的使用,它是关于0的。这个问题不是关于边界,而是关于“介于-9和9之间的随机数”,因此我猜他不会因为缺少0而感到高兴。例如,我的测试会显示他输了1。这就解决了他犯的错误。相关:
std::mt19937 gen(someSeed);
std::uniform_int_distribution<int> dis(-9, 9);
int myNumber = dis(gen)