随机数生成器C ++初学者

时间:2014-03-14 18:41:45

标签: c++ random

嗨所以我正在尝试将随机数生成器作为计算器的一部分。我过去几周一直在学习C ++,我不确定问题是什么。代码块可以检测到没有错误,但它无法正常运行。

          int first;
    int last;
    int counter;

    cout << "Enter range of the numbers you want to generate. eg. Between 1 and 20.\n"  << endl;
    cout << "Between..." << endl;
    cin >> first;
    cout << "And..." << endl;
    cin >> last;
    cout << "Enter the amount of numbers you want to generate: " << endl;
    cin >> counter;
    cout << endl;

    srand(time(0));

    for (int first; last < counter; first++)
    {
        cout << 1+(rand()%last) << endl;
    }

3 个答案:

答案 0 :(得分:4)

for (int first; last < counter; first++)
  cout << 1+(rand()%last) << endl;

在提示文字中,它听起来像firstlast与您要生成的值的数量无关,因此它们不应出现在for(...)内,只有身体。

for (int i=0; i<counter; ++i)
  cout << first+(rand()%(last-first+1)) << endl;

此外,您应该使用C ++ 11 rand()库,而不是使用srand()<random>

#include <random>

// create and seed a source of random data
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 rng(seed);

// define the distribution you want
std::uniform_int_distribution<int> dist(first, last);

for (int i = 0; i < counter; ++i) {
  std::cout << dist(rng) << '\n';
}

我认为一般来说它更容易使用,虽然语法对于初学者来说可能有点神秘。上面声明了几个变量distrng,初始化它们,然后像​​函数一样使用dist来生成所需的值。

特别注意创建分发dist比自己计算分发更简单:first+(rand()%(last-first+1))。该计算甚至可能不会产生均匀分布:某些值可能比其他值更频繁地产生。所以<random>更好,因为它更容易使用,含义更清晰,更明确。

答案 1 :(得分:3)

这里有几个问题。首先,你的for循环是错误的。你真正想要的是:

for (int i = 0; i < counter; ++i)

这将生成所请求的随机数量。

其次,要生成“first”到“last”(包括)范围内的随机数,您需要确定“last”和“first”之间的差异,得到该范围内的随机数,然后转换为值最多在“first”和“last”之间:

cout << first + (rand() % (last - first + 1)) << endl

“+1”是为了保证“last”包含允许的范围。

答案 2 :(得分:0)

我认为你的意思是for (int first=0; first < counter; first++)

此外,取随机数输出的模数会影响其属性。相反,你应该扩展它:1.0 * rand() / RAND_MAX * last;。 RAND_MAX由标准定义,1.0表示停止整数除法。