我写了一个接受整数的函数。如果用户输入例如-5,它不会崩溃,但它会将其转换为正数 =-(
int getRandoms(int size, int upper, int lower)
{
int randInt = 0;
randInt = 1 + rand() % (upper -lower + 1);
return randInt;
}
为了构建随机负整数,我应该在函数中进行哪些更改?用户输入范围。
对此有两个答案,如果您使用的是C++11,那么您应该使用uniform_int_distribtion,出于许多原因,例如为什么人们说使用随机数生成器时存在模偏差?是一个例子,而rand() 被认为是有害的演示文稿给出了一组更完整的原因。这是一个从 生成随机整数的示例-5 to 5
:
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 e2(rd());
std::uniform_int_distribution<int> dist(-5, 5);
for (int n = 0; n < 10; ++n) {
std::cout << dist(e2) << ", " ;
}
std::cout << std::endl ;
}
如果C++11不是一个选项,那么C FAQ中描述的方法如何在一定范围内获得随机整数?是要走的路。使用该方法,您将执行以下操作以从 生成随机整数[M, N]
:
M + rand() / (RAND_MAX / (N - M + 1) + 1)
对于封闭范围内的数字[lower,upper]
,您需要:
return lower + rand() % (upper - lower + 1); // NOT 1 + ...
只要upper
大于或等于 ,这将适用于正值或负值lower
。
您的版本从相同大小的范围返回数字,但从而1
不是lower
.
如果你不介意依赖,你也可以使用 Boost.Random。http://www.boost.org/doc/libs/1_54_0/doc/html/boost_random.html
您想从计算数字的范围开始,因此(例如)-10 到 +5 是 15 的范围。
您可以使用如下代码计算该范围内的数字:
int rand_lim(int limit) {
/* return a random number in the range [0..limit)
*/
int divisor = RAND_MAX/limit;
int retval;
do {
retval = rand() / divisor;
} while (retval == limit);
return retval;
}
完成此操作后,将数字调整到正确范围非常简单:将下限添加到您获得的每个数字。
请注意,C++11 添加了随机数生成器和分发类,它们可以为您处理大部分工作。
如果您确实尝试自己执行此操作,那么当您将数字减少到一个范围时,您几乎需要使用我上面显示的循环来避免倾斜。本质上,任何仅使用除法或余数的尝试几乎都不可避免地会在结果中引入偏差(即,某些结果会比其他结果更频繁地发生)。
您只需对范围的下限求和[lbound, ubound]
:
int rangesize = ubound - lbound + 1;
int myradnom = (rand() % rangesize) + lbound;