【问题标题】:c++ random number generator that allows user to choose rangec ++随机数生成器,允许用户选择范围
【发布时间】:2015-04-23 01:58:06
【问题描述】:

我必须想出一个随机数生成器,它将生成 5 个随机数,这些随机数在用户输入的两个数字的范围内。示例:用户先输入 1,然后输入 10。生成的随机数可能是 2、3、4、5、8。我可以让它给我 1 个随机数 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;
}

【问题讨论】:

  • 尝试设置时间,每次启动程序时获取不同的值。 srand (时间(NULL));

标签: c++ random numbers range generator


【解决方案1】:

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


在这种情况下,您没有正确使用“种子”一词。在伪随机数生成器的上下文中,种子是生成器的初始状态。通过将种子值传递给srand()('s' 代表种子)来为rand() 使用的 pRNG 播种。


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

使用&lt;random&gt; 生成随机值的基本方法使用两个组件:“随机性”的来源,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) 生成。请注意,此代码多次运行以产生多个值。

还请注意,您不必通过一些算术运算来操纵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) << ' ';
}

【讨论】:

  • 我同意您的解决方案更好,但对于似乎刚刚开始编码的人来说可能太复杂了。
  • @meneldal 嗯,播种更复杂,但请注意,指定所需范围更简单。我建议初学者使用 uniform_int_distribution 而不是尝试从 rand() 计算自己的分布。
  • @meneldal:还要注意原始代码中没有使用标识符“seed”作为种子值,下一个不可避免的问题是“为什么我的程序每次都会产生相同的数字序列,当它们应该是随机的”......然后是srand(time(0));(和一个额外的标题)并解释它只能在每次程序执行之前完成一次,在rand()被调用之前;很快使用rand() 看起来也越来越复杂......
  • 我也确实看到了这一点,当我确实注意到它时,我应该编辑我的答案。我同意这个变量的名字很糟糕。
【解决方案2】:

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

【讨论】:

  • " 我可以让它给我 1 个随机数 5 次,但不能给我 5 个不同的随机数。"我想回答问题的那一部分。我实际上没有看到他在最小值上也犯了错误。
  • 非常感谢!但是如果 num2 大于 num1 我该怎么办?我们还没有涵盖循环,所以我认为我不能或不应该使用它们来使用它们。
  • 如果你不想使用循环,你可以一个接一个地复制/粘贴这两行(丑陋但它有效)。您可以使用条件来检查和切换例如:if(num2&gt;num1){int temp=num1; num1=num2; num2=temp;}
猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 2019-08-06
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多