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

新手上路,请多包涵

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

 #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。在这里,输出在边界之外以及它们之间。我究竟做错了什么?

预先感谢您的帮助!

原文由 bluthunder 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 550
2 个回答

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

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

原文由 karastojko 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 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';
    }
}

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

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

std::default_random_engine generator(seed);

原文由 Paul Rooney 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏