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

blu*_*der 2 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 
Run Code Online (Sandbox Code Playgroud)

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

预先感谢您的帮助!

kar*_*jko 6

rand返回 0 到 之间的数字RAND_MAX。通过取模,userEnd - userBeg + 1边界将被限制为 0 和userEnd - userBeg。如果随机数应该在给定的边界内,那么userBeg应该相加,所以微积分变成

    outPut = rand()%((userEnd - userBeg) + 1) + userBeg; 
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于边界,而不是“兰德”精度。 (2认同)
  • 即使“rand”是完美的,这种方法也会“减少”随机性。对于非关键应用程序来说可能就足够了,但每个人都应该注意这一警告。 (2认同)

Pau*_*ney 6

使用c ++ 11 random库.

你可以使用std::default_random_engine(或任何其他随机引擎)std::uniform_int_distribution.

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

例如

#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';
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望播种随机引擎,请创建它.

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

std::default_random_engine generator(seed);
Run Code Online (Sandbox Code Playgroud)