我正在尝试编写一个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 :(得分:3)
(目前,如果发现重复的字符,循环将不会终止。)除此之外,由于其他一些原因,代码很糟糕:
您假设ASCII 编码,标准无法保证。
对替换进行采样可能会导致循环问题,并且还会产生统计异常(尽管使用像rand()
这样的原始生成器,这些并不比生成器本身差。)
一种解决方案是写
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。