我正在从Bjarne Stroustrup的“使用C ++编程原理和实践”一书(第130页,练习13)中进行牛市和牛市的分配,我希望程序生成0到9范围内的四个不同整数(例如1234,但是不是1122)
我制作了一个用于存储数字的向量,并生成了一个生成4个数字并将其添加到向量的函数,但是数字可能是相同的,因此我无法将数字返回给主函数
#include "../..//..//std_lib_facilities.h"
vector<int> gen4Nums(vector<int> secNum)
{
random_device rd; // obtain a random number from hardware
mt19937 eng(rd()); // seed the generator
uniform_int_distribution<> distr(0, 9); // define the range
secNum.clear();
for (int i = 0; i < 4; i++)
{
secNum.push_back(distr(eng));
cout << secNum[i];
}
return secNum;
}
int main()
{
vector<int> secNum;
gen4Nums(secNum);
}
我希望将4个不同的随机数返回给主函数
答案 0 :(得分:2)
如果您这样更改代码,则可以确保获得不同的随机数:
#include <vector>
#include <random>
#include <algorithm>
using namespace std;
vector<int> gen4Nums()
{
vector<int> result;
random_device rd; // obtain a random number from hardware
mt19937 eng(rd()); // seed the generator
uniform_int_distribution<> distr(0, 9); // define the range
int i = 0;
while(i < 4) { // loop until you have collected the sufficient number of results
int randVal = distr(eng);
if(std::find(std::begin(result),std::end(result),randVal) == std::end(result)) {
// ^^^^^^^^^^^^ The above part is essential, only add random numbers to the result
// which aren't yet contained.
result.push_back(randVal);
cout << result[i];
++i;
}
}
return result;
}
int main() {
vector<int> secNum = gen4Nums();
}
答案 1 :(得分:2)
似乎您正在尝试生成4个唯一的随机整数,范围为0 ... 9。
您可以通过生成包含值0 ... 9的整数向量来实现此目的。然后将向量随机播放,因为您希望它是整数的随机选择。最后,将向量修剪为所需的大小,因为您只需要4个唯一的随机整数:
#include <vector>
#include <random>
#include <algorithm>
#include <numeric>
void gen4Nums(std::vector<int>& v) {
//Generate initial vector with values 0...9:
v.resize(10, 0);
std::iota(v.begin(), v.end(), 0);
//Shuffle the vector:
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);
//Trim the vector to contain only 4 integers:
v.resize(4);
}