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

結果をテキスト ファイルに書き込む際に問題が発生しました。

4

4 に答える 4

7

C++ で何かを「シャッフルする方法」に対する答えは、標準ライブラリのシャッフル アルゴリズムの 1 つを使用することです。それを行う簡単な方法は、それを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);
于 2012-07-15T08:59:00.910 に答える
4

ほら、フィッシャー・イェイツ・シャッフル

そしてC++実装

于 2012-07-15T09:00:44.150 に答える
2

問題は、文字値 0 が A にマップされていないことです。むしろ、A として出力される文字は 65 に等しいです。必要に応じて、ここで完全な表を見ることができます。

とにかく、コードの解決策は簡単です。それ以外の

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

できるよ:

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

(-1 は、文字に 0 から 25 ではなく 1 から 26 の番号を付けたためです)。

于 2012-07-15T09:01:48.003 に答える
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 が優先されます。

于 2012-07-15T09:17:54.443 に答える