如何将char“abcdefghijklmnopqrstuvwxyz”洗牌而不重复

时间:2012-07-15 08:56:07

标签: c++ random shuffle

const char chars[] = "abcdef ...."; 
char result[...];
memcpy(result, chars, sizeof(chars)); 
for (unsigned i = 0; i < (sizeof(chars)-1); ++i) {
    unsigned j = rand() % sizeof(chars);
    char tmp = result[j];
    result[j] = result[i];
    result[i] = tmp;
} 

将结果写入文本文件的问题。

4 个答案:

答案 0 :(得分:7)

C ++中“如何改组”的答案是使用标准库的一种改组算法。一种简单的方法是将其放在std::string中,然后使用std::random_shuffle

std::string s = "abcdef ...." ;
std::random_shuffle(s.begin(), s.end());

您也可以使用数组:

char letters[] = {'a', 'b', ..... };
std::random_shuffle(letters, letters+26);

答案 1 :(得分:4)

答案 2 :(得分:2)

你的问题是字符值0没有映射到A.相反,一个将打印为A的字符等于65.如果你需要,你可以看到完整的表here

无论如何,代码解决方案很简单。 而不是

cout<<letter[i]<<" ";

你可以这样做:

cout<<letter[i]+'A'-1<<" ";

(-1是因为你将字母从1到26编号而不是0到25)。

答案 3 :(得分:0)

const char chars[] = "abcdef ...."; 
char result[...];
memcpy(result, chars, sizeof(chars)); 
for (unsigned i = 0; i < (sizeof(chars)-1); ++i) {
    unsigned j = rand() % sizeof(chars);
    char tmp = result[j];
    result[j] = result[i];
    result[i] = tmp;
}

如果您使用STL,则首选std :: random_shuffle。