嗨所以我正在尝试将随机数生成器作为计算器的一部分。我过去几周一直在学习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;
}
答案 0 :(得分:4)
for (int first; last < counter; first++) cout << 1+(rand()%last) << endl;
在提示文字中,它听起来像first
和last
与您要生成的值的数量无关,因此它们不应出现在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';
}
我认为一般来说它更容易使用,虽然语法对于初学者来说可能有点神秘。上面声明了几个变量dist
和rng
,初始化它们,然后像函数一样使用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表示停止整数除法。