我正在尝试生成0到9之间的唯一随机数。相同的数字不能生成两次,并且该函数将运行9次(直到使用所有9个数字。)这是我最近的方式试图这样做:
int uniqueRandomInt(int x) {
std::vector<int> usedRandoms;
int random = x;
//Iterate vector
for (unsigned int i = 0; i < usedRandoms.size(); i++) {
//if passed value is in vector
if (random = usedRandoms[i]) {
uniqueRandomInt(random);
}
else {
//If unique rand found put into vector
usedRandoms.push_back(random);
return random;
}
}
}
使用以下方法在另一个函数中调用它:
cout << uniqueRandomInt(-1) << endl;
我得到的结果是:
17801152 (Changes every time the function is called)
我是否完全错了?我确实尝试了其他方法,但没有运气,这就是我现在所处的位置。提前谢谢。
答案 0 :(得分:1)
我更喜欢使用shuffle。
#include <algorithm>
#include <iostream>
#include <random>
#include <vector>
#include <cassert>
class T455_t
{
private:
// data
std::vector<int> m_iVec ;
public:
T455_t() {}
int exec()
{
std::vector<int> iVec;
gen10();
for (int i=0; i<10; ++i)
{
int nxtRandom = uniqueRandomInt();
std::cout << nxtRandom << std::endl;
}
return(0);
}
private: // methods
void gen10() // fills data attribute with 10 digits
{
for (int i=0; i<=9; ++i)
m_iVec.push_back(i);
std::random_device rd;
std::mt19937_64 gen(rd());
std::shuffle (m_iVec.begin(), m_iVec.end(), gen);
// m_iVec now contains 10 unique numbers,
// range 0..9, in random order
}
int uniqueRandomInt()
{
assert(m_iVec.size());
int retVal = m_iVec.back(); // gets last element in vector
m_iVec.pop_back(); // removes last element
return(retVal);
}
}; // class T455_t
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "");
std::ios::sync_with_stdio(false);
std::chrono::high_resolution_clock::time_point m_start_us =
std::chrono::high_resolution_clock::now();
int retVal = -1;
{
T455_t t455;
retVal = t455.exec();
}
std::chrono::microseconds chrono_duration_us =
std::chrono::duration_cast <std::chrono::microseconds>
(std::chrono::high_resolution_clock::now() - m_start_us);
std::cout << " FINI " << chrono_duration_us.count()
<< " us" << std::endl;
return(retVal);
}
答案 1 :(得分:0)
如果usedRandoms.size()
为零,您的功能似乎不会返回值,这是您第一次调用该功能时
int uniqueRandomInt(int x) {
std::vector<int> usedRandoms; // vector.size() = 0
int random = x;
// for loop won't be entered
for (unsigned int i = 0; i < usedRandoms.size(); i++)
{
}
// function doesn't return a value
}
值得注意的是,声明函数返回值然后不返回值是未定义的行为。这就是随机值的原因。
从C ++标准,6.6.3(强调我的):
离开函数末尾相当于没有值的返回; 会导致值返回函数中的未定义行为 。
答案 2 :(得分:0)
vector<int> initVector(){
vector<int> ret;
ret.clear();
for(int i = 0 ; i < 10 ; ++i){
ret.push_back(i);
}
return ret;
}
int uniqueRendom(){
static vector<int> randomNumbers = initVector();
int randomSize = randomNumbers.size() - 1;
if(randomSize <= 0){
return -1;
}
double randomeNum = (double)rand() / INT_MAX;
int randomIndex = (int) (randomeNum * randomSize + 0.5) ;
int returnValue = randomNumbers[randomIndex];
randomNumbers.erase(randomNumbers.begin() + randomIndex);
return returnValue;
}
包括INT_MAX的limits.h。