C++ 生成唯一的5位数字

C++ 生成唯一的5位数字,c++,algorithm,permutation,C++,Algorithm,Permutation,我被告知要编写生成唯一5位数字的程序(例如12345是唯一的,11234不是唯一的) 我已经编写了以下代码 #include <iostream> #include <stdlib.h> #include <map> using namespace std; using std::rand; const int k=99999-10234; bool unique(int t){ map<int,int>my; map<i

我被告知要编写生成唯一5位数字的程序(例如12345是唯一的,11234不是唯一的)
我已经编写了以下代码

#include <iostream>
#include <stdlib.h>
#include <map>
using namespace std;
using std::rand;
const int k=99999-10234;
bool  unique(int t){

    map<int,int>my;
    map<int,int>::iterator it;
    while (t!=0){
        ++my[t%10];
    t/=10;
}
    for (it=my.begin();it!=my.end();it++){

        if ( it->second>0) {
             return false;
        }
    }

       return true;
}
int main(){
    int m=0;
     m= 10234+ rand()%k;
    if (unique(m)){
         cout<<" unique number was generated =:"<<m<<" ";
    }
    else{

        do{


             m=10234+rand()%k;
               if (unique(m)){
                   cout<<"unique  number was generated"<<m<<" ";
                break;
               }

    }   while(!unique(m));


    }


     return 0;
}
#包括
#包括
#包括
使用名称空间std;
使用std::rand;
常数int k=99999-10234;
布尔唯一(int t){
mapmy;
对它进行迭代器;
while(t!=0){
++我的[t%10];
t/=10;
}
for(it=my.begin();it!=my.end();it++){
如果(它->秒>0){
返回false;
}
}
返回true;
}
int main(){
int m=0;
m=10234+rand()%k;
if(唯一(m)){
我认为这句话:

if ( it->second>0) {
应该是:

if ( it->second>1) {
因为当你找到一个数字的第一个实例并把它放在地图上时,地图上该数字的值是1,而不是0。

我认为这行:

if ( it->second>0) {
应该是:

if ( it->second>1) {

因为当你找到一个数字的第一个实例并把它放在地图上时,地图上该数字的值是1,而不是0。

我想有更简单的方法来生成你需要的数字,例如

std::vector<int> digs;
for (int i = 0; i < 10;++i)
    digs.push_back(i); // Init digits

std::random_shuffle(digs.begin(), digs.end()); // Get random 10-digits number
int result = 0;
int i = 0;
while (result < 10000) { // Get 5-digit number from it
    result*=10;
    result += digs[i];             
    ++i;
}

cout << result << endl;
std::向量挖掘;
对于(int i=0;i<10;++i)
digs.push_back(i);//初始数字
std::random_shuffle(digs.begin(),digs.end());//随机获取10位数
int结果=0;
int i=0;
而(结果<10000){//从中获取5位数字
结果*=10;
结果+=digs[i];
++一,;
}

cout我想有更简单的方法来生成您需要的号码,例如

std::vector<int> digs;
for (int i = 0; i < 10;++i)
    digs.push_back(i); // Init digits

std::random_shuffle(digs.begin(), digs.end()); // Get random 10-digits number
int result = 0;
int i = 0;
while (result < 10000) { // Get 5-digit number from it
    result*=10;
    result += digs[i];             
    ++i;
}

cout << result << endl;
std::向量挖掘;
对于(int i=0;i<10;++i)
digs.push_back(i);//初始数字
std::random_shuffle(digs.begin(),digs.end());//随机获取10位数
int结果=0;
int i=0;
而(结果<10000){//从中获取5位数字
结果*=10;
结果+=digs[i];
++一,;
}

这是一个更聪明的算法。不过,我会在洗牌之后直接调用
std::copy(digs.begin(),digs.begin()+5,std::ostream_迭代器(std::cout));
。为什么要在一个int中花费7行来获取所有十进制数字,而操作是冗余的(?)行仅用于处理第一位数字为“0”的情况,因此从技术上讲,前5位数字不会生成5位数字。这是更智能的算法。我只需调用
std::copy(digs.begin(),digs.begin()+5,std::ostream\u迭代器(std::cout));
但直接在洗牌之后。为什么要花7行来获取int中的所有十进制数字,而operatorhose冗余(?)行只是处理第一位数字为“0”的情况,所以从技术上讲,前5位数字不会生成5位数字。