如何在不重复的情况下随机播放字符"abcdefghijklmnopqrstuvwxyz"

how to shuffle char "abcdefghijklmnopqrstuvwxyz" without repeating

本文关键字:随机 播放 字符 情况下 abcdefghijklmnopqrstuvwxyz      更新时间:2023-10-16
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;
} 

将结果写入文本文件时出现问题。

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);

你来了:费舍尔-耶茨洗牌。

以及C++实施。

您的问题是字符值 0 未映射到 A。 相反,将打印为 A 的字符等于 65。如果需要,您可以在此处查看完整表格。

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

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

你可以做:

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

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

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。