如何使用非重复字母打印随机字符串?

时间:2016-12-15 10:08:22

标签: c++

我正在尝试编写一个c ++程序,用a-z(ascii代码97到122)打印一个带有非重复字母的随机10个字母的字符串。我编写的这段代码有时运行得很好但是大多数情况下while循环无限运行。 问题出在哪里?

(编辑:在解决问题的同时设置标志= 0)

void randomstring()
{int i,j,flag=1;
 char x, s[20]=" ";
 srand(time(0));
 for(i=0;i<10;i++)
 {flag=1; //ensure entry into while
  while(flag)
  {x=rand()%26+97; //get random letter from a-z
   for(j=0;j<10;j++)
   {if(x==s[j]) //match with existing letters
     flag=2; //if matched, try again
   }
   if(flag!=2)
   {s[i]=x; //if doesn't match, add to string
    flag=0; //exit while
   }
  }
 }
 cout<<s;
}

2 个答案:

答案 0 :(得分:3)

(目前,如果发现重复的字符,循环将不会终止。)除此之外,由于其他一些原因,代码很糟糕:

  1. 您假设ASCII 编码,标准无法保证。

  2. 对替换进行采样可能会导致循环问题,并且还会产生统计异常(尽管使用像rand()这样的原始生成器,这些并不比生成器本身差。)

  3. 一种解决方案是写

    char s[] = {'a', 'b', 'c', .../*ToDo - type out all the other letters*/, 'z'}

    使用

    shuffle

    std::random_shuffle(std::begin(s), std::end(s));
    

    并读出s的前10个元素。

答案 1 :(得分:1)

一旦标志设置为2,它就会卡住。你应该在while循环中将标志重置为1。