c ++随机数生成器,允许用户选择范围

时间:2015-04-23 01:58:07

标签: c++ random numbers range generator

我必须提出一个随机数生成器,它将生成5个随机数,这些数字在用户输入的两个数字的范围内。示例:用户首先输入1然后10.生成的随机数可以是2,3,4,5,8。我可以得到它给我一个随机数5次,但不是5个不同的随机数。请看下面。任何帮助表示赞赏。谢谢!

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main ()
{
        int num1, num2, randNum, seed;


        cout << "enter number 1.\n";
        cin >> num1;
        cout << "enter number 2.\n";
        cin >> num2;

seed = num1 - num2;
randNum = rand() % seed + 1;

        cout << randNum << "\n";
        cout << randNum << "\n";
        cout << randNum << "\n";
        cout << randNum << "\n";
        cout << randNum << "\n";

return 0;
}

2 个答案:

答案 0 :(得分:2)

您正在生成一个随机数,然后将其打印五次。代码rand() % seed + 1是生成值的代码。您将该值保存在randNum中并打印五次。您可以多次运行代码rand() % seed + 1以获取多个值。

你没有使用“种子”这个词。正确地在这种情况下。在伪随机数发生器的上下文中,种子是发生器的初始状态。播种rand()使用的pRNG是通过将种子值传递给srand()(&#39; s代表种子)来完成的。

无论如何,你不应该使用rand()。而是使用C ++ <random>库。使用此库,您可以非常轻松地在用户定义的范围内创建值。

使用<random>生成随机值的基本方法使用两个组件:随机性来源&#39;,pRNG,我称之为引擎,以及对象来自引擎的随机性并使用它在特定范围内随机生成值。

#include <iostream>
#include <random>

int main() {
    int min, max;
    std::cout << "enter number 1.\n";
    std::cin >> min;
    std::cout << "enter number 2 (greater than number 1).\n";
    std::cin >> max;

    std::uniform_int_distribution<> make_number_in_range(min, max);
    std::mt19937 engine;

    std::cout << make_number_in_range(engine) << ' ';
    std::cout << make_number_in_range(engine) << ' ';
    std::cout << make_number_in_range(engine) << ' ';
    std::cout << make_number_in_range(engine) << ' ';
    std::cout << make_number_in_range(engine) << ' ';
}
  

输入数字1. 1
  输入数字2(大于数字1)。 6
  5 2 5 6 2

在此代码中,值由代码make_number_in_range(engine)生成。请注意,此代码会多次运行以生成多个值。

另请注意,您不必通过一些aritmetic操作来操纵rand()的结果,而只需告诉make_number_in_range您想要的范围。您的原始代码执行错误的算术,但此代码不必担心它。

每次使用特定输入运行时,原始程序和上面显示的程序都不会产生不同的输出。这是因为随机数生成器始终以相同的初始状态开始。 (但是,不同的实现可能会显示不同的结果,因此当您尝试我使用的范围时,您可能看不到我在上面显示的相同数字。)

为了在每次运行程序时获得不同的结果,您需要每次都对pRNG进行不同的播种。为此,您可以像这样更新程序:

#include <iostream>
#include <random>

int main() {
    int min, max;
    std::cout << "enter number 1.\n";
    std::cin >> min;
    std::cout << "enter number 2 (greater than number 1).\n";
    std::cin >> max;

    std::uniform_int_distribution<> make_number_in_range(min, max);

    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937 engine(seed);

    std::cout << make_number_in_range(engine) << ' ';
    std::cout << make_number_in_range(engine) << ' ';
    std::cout << make_number_in_range(engine) << ' ';
    std::cout << make_number_in_range(engine) << ' ';
    std::cout << make_number_in_range(engine) << ' ';
}

答案 1 :(得分:1)

每次调用randNum时都不会修改

cout,因此它始终显示相同的值。如果你想让它工作,你需要使用像这样的循环

for(int i=0;i<5;i++){
    randNum = rand() % seed + num2;
    cout << randNum << "\n";
}

第二个错误是使用+1代替+num2,因此假设num2小于num1,这将生成您期望的范围内的数字。

您应该考虑的另一件事是变量seed的名称。种子是用于初始化随机数生成器的种子。这里你的变量只是用来表示一个范围。要在每次运行程序时获得不同的结果,您需要使用某些内容初始化rand,例如:srand(time(0));