0到9之间的唯一随机数

时间:2017-01-24 23:52:45

标签: c++ random

我正在尝试生成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)

我是否完全错了?我确实尝试了其他方法,但没有运气,这就是我现在所处的位置。提前谢谢。

3 个答案:

答案 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。