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

How to generate negative random integer in c++

本文关键字:随机 整数 c++      更新时间:2023-10-16

我写了一个接受整数的函数。如果用户键入例如 -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;