如何生成2个值之间的随机数,包括在内?

时间:2016-10-27 03:14:26

标签: c++ random user-input

我需要帮助弄清楚如何在两个用户输入的值之间生成一定数量的随机数,包括在内。只是你知道,我已经搜索了这个,但我没有找到我刚才所说的。这是我的代码:

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main()
{
    int userBeg, userEnd, outPut;

    cout << "Enter a start value: ";
    cin >> userBeg;
    cout << "Enter an end value: ";
    cin >> userEnd;

    srand(time(NULL)); //generates random seed val

    for (int i = 0; i < 5; i++) {
      //prints number between user input, inclusive
    outPut = rand()%((userEnd - userBeg) + 1); 
    cout << outPut << "  ";
    }//end for

    return 0;
}//end main 

我对以下范围的输出感到困惑: 1-100产量输出数字介于50,97,24,59,22之间,但不包括边界。 但是,10-20个产量数字,例如1,14,6,12,13。这里,输出在边界之外以及它们之间。我做错了什么?

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:5)

使用c ++ 11 random库。

您可以将std::default_random_engine(或任何其他随机引擎)与std::uniform_int_distribution一起使用。

传递给std::uniform_int_distribution的值将是随机范围的下限和上限。

e.g。

#include <iostream>
#include <random>

int main()
{
    const int nrolls = 100;

    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(0,9);

    int p[nrolls]={};

    for (int i=0; i<nrolls; ++i)
    {
        p[i] = distribution(generator);
    }

    std::cout << "uniform_int_distribution (0,9):" << '\n';
    for (int i=0; i<nrolls; ++i)
    {
        std::cout << i << ": " << p[i] << '\n';
    }
}

如果您希望为随机引擎播种,请将其创建为。

unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();

std::default_random_engine generator(seed);

答案 1 :(得分:2)

要使兰特工作,你需要做:

#include <cstdlib>

int main() {

    int Min = 103;
    int Max = 113;

    int Number = std::rand() % (Max + 1 - Min) + Min;

    return 0;
}

为了清楚起见,我省略了cin。 (最大+ 1 - 分钟)使其具有包容性。 + Min设置最小值!

因此填入您可能使用的功能中:

int randint(int Min, int Max) {
    return std::rand() % (Max + 1 - Min) + Min;
}

经过测试,它可以使用负数和正数。

示例输出(带循环和cout):

<强> 11-23

The number is: 13
The number is: 18
The number is: 14
The number is: 17
The number is: 18
The number is: 18
The number is: 23
The number is: 15
The number is: 11
The number is: 22
The number is: 22
The number is: 11
The number is: 22
The number is: 16
The number is: 14
The number is: 21
The number is: 16
The number is: 19
The number is: 15
The number is: 13
The number is: 17

<强> 1239年至1242年

The number is: 1240
The number is: 1242
The number is: 1239
The number is: 1241
The number is: 1241
The number is: 1241
The number is: 1239
The number is: 1240
The number is: 1240
The number is: 1240
The number is: 1242
The number is: 1240
The number is: 1242

答案 2 :(得分:2)

rand返回0到RAND_MAX之间的数字。通过取模userEnd - userBeg + 1,边界将限制为0和userEnd - userBeg。如果随机数应在给定的边界内,则应添加userBeg,因此微积分变为

    outPut = rand()%((userEnd - userBeg) + 1) + userBeg; 

答案 3 :(得分:2)

它仍然是实验性的,但它正是你想要的

http://en.cppreference.com/w/cpp/experimental/randint

#include <iostream>
#include <experimental/random>

int main()
{
    int random_number = std::experimental::randint(100, 999);
    std::cout << "random 3-digit number: " << random_number << '\n';
}

编辑:它真的是随机的http://en.cppreference.com/w/cpp/numeric/random