如何在c ++中生成负随机整数

时间:2013-11-07 00:40:50

标签: c++ random

我写了一个带整数的函数。如果用户键入例如-5,它不会崩溃,但它会将其转换为正= - (

int getRandoms(int size, int upper, int lower)
{
    int randInt = 0;
    randInt = 1 + rand() % (upper -lower + 1);
    return randInt;
}

为了构建随机负整数,我应该在函数中进行哪些更改? 用户输入范围。

5 个答案:

答案 0 :(得分:4)

对此有两个答案,如果你使用的是 C ++ 11 ,那么你应该使用uniform_int_distribtion,因为有很多原因,例如Why do people say there is modulo bias when using a random number generator?是优选的一个示例和rand() Considered Harmful presentation给出了更完整的原因。以下是从-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 不是一个选项,那么How can I get random integers in a certain range? C FAQ 中描述的方法就是可行的方法。使用该方法,您将执行以下操作以从[M, N]

生成随机整数
M + rand() / (RAND_MAX / (N - M + 1) + 1)

答案 1 :(得分:3)

对于封闭范围[lower,upper]中的数字,您需要:

return lower + rand() % (upper - lower + 1);   // NOT 1 + ...

只要upper大于或等于lower,这将适用于正值或负值。

您的版本会返回相同尺寸范围内的数字,但从1而不是lower开始。

答案 2 :(得分:0)

如果你不介意依赖,你也可以使用Boost.Random。 http://www.boost.org/doc/libs/1_54_0/doc/html/boost_random.html

答案 3 :(得分:0)

你想从计算数字的范围开始,所以(例如)-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添加了随机数生成器和分发类,可以为您处理大部分内容。

如果您确实尝试自行执行此操作,当您将数字减少到某个范围时,您几乎需要使用上面显示的循环以避免偏斜。基本上任何仅仅使用除法或余数的尝试几乎不可避免地会导致结果的偏差(即,某些结果将比其他结果更频繁地发生)。

答案 4 :(得分:0)

您只需求和[lbound, ubound]范围的下限:

int rangesize = ubound - lbound + 1;
int myradnom = (rand() % rangesize) + lbound;