如何生成在两个值之间(含)的随机数?涉及 IT 技术。

4

我需要帮助解决如何生成一组在用户输入的两个值之间(包括这两个值)的随机数。请注意,我已经搜索了相关内容,但没有找到我所说的方法。以下是我的代码:

#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。这里,输出既在边界之外,也在边界之间。我做错了什么吗?谢谢您提前的帮助!

outPut +=userBeg - Danh
1
如果你正在使用C++11,请查看std::uniform_int_distribution - Danh
如果 rand 很快但质量低,那么在提取随机位之前,可以通过将其结果除以一些适当的小常数来消除(影响)最后几个位,从而获得更好的随机性。 - Cheers and hth. - Alf
4个回答

11

使用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);

6

rand函数返回0到RAND_MAX之间的随机数。通过对userEnd-userBeg+1取模可将范围限制在0到userEnd-userBeg之间。如果随机数应该在给定的范围内,则应加上userBeg,从而使计算变为

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

1
这个答案会产生偏差的结果,有些数字比其他数字更有可能出现。最好使用C++更现代的随机数工具,而不是rand - Mark Ransom
2
问题涉及边界,而不是 rand 的准确性。 - karastojko
2
即使 rand 函数是完美的,该方法也可以减少随机性。对于非关键应用程序可能已经足够,但每个人都应该意识到这个警告。 - Mark Ransom

4

1
我会删除这个答案中的“实验性”部分,因为自2011年以来已经有了标准解决方案:http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution - Mark Ransom
是的,我已经知道了。我只是想为这个问题提供另一种简短的方法。顺便说一下,谢谢。 - khôi nguyễn

2
为了使随机数工作,您需要执行以下操作:
#include <cstdlib>

int main() {

    int Min = 103;
    int Max = 113;

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

    return 0;
}

为了清晰起见,我省略了 cin。 (Max + 1 - Min) 让它包含在内。+ 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

嗯...实际上,即使没有任何包含文件,它也可以编译和运行得很好。 - Carl
1
当然,那么你不应该包含未使用的库。 - khôi nguyễn
我已经更新了答案。谢谢你指出来!:D - Carl
std::rand给我带来了些麻烦,在ideone.com上,如果我使用C++14,那么就没问题,但是对于G++ 5.1和G++4.3.2,我必须包含cstdlib。 - khôi nguyễn
1
找出原因 :) https://dev59.com/wVsV5IYBdhLWcg3wsQnf 由于您使用C++11 - khôi nguyễn
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接