C++ 如何生成每个数字都不同于其他数字的九位数数字

C++ 如何生成每个数字都不同于其他数字的九位数数字,c++,algorithm,C++,Algorithm,我正在制作一个程序,我需要生成所有9位数字,每个数字与其他数字不同,在这种情况下,0不是有效数字,因此我只考虑从1到9的数字 到目前为止,我使用随机数生成解决方案,但我面临性能问题 using namespace std; #include <iostream> #include <stdlib.h> #include <time.h> #include <vector> #include <string> #include <m

我正在制作一个程序,我需要生成所有9位数字,每个数字与其他数字不同,在这种情况下,0不是有效数字,因此我只考虑从1到9的数字

到目前为止,我使用随机数生成解决方案,但我面临性能问题

using namespace std;
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <string>
#include <map>

int main()
{
    srand (time(NULL));

    int secret;
    string number = "";

    map <string, bool> m;
    int count = 0;

    int nine_permutation = 362880;

    vector <int> v{0,1,2,3,4,5,6,7,8,9};
    int x = 9;

    while(count < nine_permutation)
    {
      for(int i = 0; i < 9; i++)
      {
          secret = rand() % x +1;
          number += to_string(v[secret]);
          v.erase(v.begin() + secret);

          x--;
      }
      x = 9;
      v = {0,1,2,3,4,5,6,7,8,9};
      if(m.count(number) == 0)
      {
        m[number] = true;
        count ++;
      }


      cout << count << endl;
    }


    cout << number;
}
使用名称空间std;
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
srand(时间(空));
int秘密;
字符串编号=”;
地图m;
整数计数=0;
int-nine_置换=362880;
向量v{0,1,2,3,4,5,6,7,8,9};
int x=9;
while(计数<九次排列)
{
对于(int i=0;i<9;i++)
{
secret=rand()%x+1;
数字+=到_字符串(v[secret]);
v、 擦除(v.begin()+秘密);
x--;
}
x=9;
v={0,1,2,3,4,5,6,7,8,9};
如果(m.计数(数字)==0)
{
m[数字]=真;
计数++;
}

cout所以你有10个数字
0,1,2,3,4,5,6,7,8,9
和你想用9个数字得到的数字。 我认为您可以从
123456789
开始,生成所有排列,然后将每个字符替换为“0”,这将给出一组:
{023456789、103456789、120456789、123056789、123406789、123450789、123456089、123456709、123456780}
。对于该集合中的每个元素,还生成所有排列。 大概是这样的:

void allNumbersWithDistinctDigits() {
    int idxForZero = 0;
    std::string initial("123456789");

    std::string local(initial);
    do {
        while (std::next_permutation(local.begin(), local.end())) {
            if (local[0] != '0') {
                std::cout << local << std::endl;
            }
        }
        local = initial;
        local[idxForZero] = '0';
    } while(++idxForZero <= initial.size());

}
void allnumberswithdistinctdigts(){
int idxForZero=0;
std::字符串首字母(“123456789”);
std::字符串本地(首字母);
做{
while(std::next_置换(local.begin(),local.end()){
如果(本地[0]!=“0”){

std::cout什么性能问题;你在哪里发现了瓶颈?程序在大约43000个数字后突然停止生成。然后它崩溃了,我不得不通过任务管理器将其关闭,因为窗口完全冻结。可能重复读取关于
std::next\u permutation
。随机生成所有排列将花点时间-尤其是使用
rand
和`%,因为你的随机数字不是均匀分布的。要有系统,而不是随机的。