2012-04-04 4 views
1

私は以前にランダムな符号なしの文字を生成することに関連する質問をしてきました。しかし、私が適用したシンプルさのために、かなり良い提案がありました。 srand((unsigned)time(NULL)); rand()%256; 署名されていない文字の乱数は '?'のままです。

私はsrandをプログラムの冒頭で呼び出しますが、私は '?'ランダムな文字の場合すべての時間ではなく、ほとんどの時間とそれが私の焦点を失う原因になります。

+3

数値を調べて、実際には '?'(ASCII値63)であることを確認していますか?それとも、文字を印刷していますか?もしそうなら、ASCII以外の値(128-255など)が '?'として出力される可能性があります。それを印刷する前に 'int'に変換してみてください。 –

+0

あなたが観察していることを説明してください。ランダムなcharのために。さらに、**短い**、**完全な**テストプログラムを提供してください。 http://sscce.org/を参照してください。 –

答えて

9

ほとんどの場合、あなたの端末は印刷の方法が必要でないというランダムな文字が引き続き得られます。?。印刷する前にintに変換してみてください。

std::cout << (int)my_random_char; 
+0

ありがとう、私の問題を解決しました。私は現在、Macで文字をUbuntuターミナルに表示していますか? – Ali

+2

@rolandbishop:いくつかはそうでないかもしれないかもしれません。それは端末の設定、キャラクタセットに依存します...もしあなたがランダムな数字を生成しているならば*数字ではない*文字を出力しなければなりません。これが 'int'への変換が果たす役割です。必要なものが実際の文字である場合は、印刷可能なサブセットのみを使用することを検討してください。 –

3

プラットフォームに応じて値[128 255]は、独自の有効な文字ではないかもしれません。印刷可能なランダムなアスキー文字が必要な場合は、範囲[32 127]の文字を生成する必要があります。

ここでは、あなたの他の質問に答えて、印刷可能なASCII文字のみを選択するコードを変更しました。

int main() { 
    std::random_device r; 
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; 
    auto rand = std::bind(std::uniform_int_distribution<char>(' ','~'), 
          std::mt19937(seed)); 

    std::generate_n(std::ostream_iterator<char>(std::cout," "), 25, rand); 
} 
+0

@rolandbishop:C++は文字値の範囲がすべて印刷可能であることを保証するわけではありませんが、32-127はほとんどすべてで動作する傾向があります。 –

+0

はい、実装がASCII互換ではない可能性があります。最近はエキゾチックなシステムを除いてすべてがあります。 – bames53

5

あなたは「?」を取得していません。文字として、選択された文字が印刷可能でないため、そのように印刷されています。これを整数で表示すると、期待どおりの値がランダムであることがわかります。考慮すべき

1

いくつかのこと:

  1. rand()の各呼び出しの前srand()を呼び出すことはありません。あなたのプログラムが始まったときに一度呼びます(本当にしたい場合)。
  2. 何が起こるかを見るために、符号なしの文字を整数として出力してみてください。
+0

は既に私が一度それを呼んでいたと言っています... – Ali

+0

ああ、はい...他の人も同様に指摘しているように、整数のために行ってください。ほとんどの場合、アスキー範囲外の値は '?'で表示されます。ターミナルに。 – Axel

+0

PS:あなたはあなたの編集権にそれを加えましたか?私は以前にそれを見たことがないと誓うことができました。 – Axel

1

符号なしの文字は文字ではありません。彼らはバイトです。 0から255までのランダムなバイトを取得していますが、これらのうちのいくつか(またはほとんどはエンコーディングに応じて)は有効な文字ではありません。

あなたはとzの間のランダムな文字を使用する場合は、例えば、

unsigned char c = 'a' + rand() % 26; 

rand() % 26のようなものを使用すると、これを行うための推奨方法ではありませんが、それはほとんどのアプリケーションには十分だ。manページを参照してください。 。)

関連する問題