2016-12-15 128 views
1

我正在嘗試編寫一個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; 
} 
+0

[可能的重複](http://stackoverflow.com/questions/41015311/picking-about-random-character-without-repetition-c) – izlin

+0

使用循序漸進的調試 –

回答

3

(目前循環將不若重複字符被發現終止。)但是,除了這個,代碼討厭的一對夫婦的其他原因:

  1. 你假設ASCII編碼不是由標準的保證。

  2. 採樣替換可能會導致循環問題,並且還可能產生統計異常(儘管像rand()這樣的粗發生器不會比發生器本身更糟糕)。

一種解決方案是寫

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

使用

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

洗牌這和讀出的s前10個元素。

+0

你能解釋爲什麼loop doesn發現重複時終止? – novice

+0

下面的答案(我upvoted)做。 – Bathsheba

1

一旦標誌設置爲2,它就會卡住。您應該在while循環內將標誌重置爲1。