web-dev-qa-db-ja.com

cでランダムな文字を生成する

私はCでプログラミングするのが初めてで、random()関数を使用してAからZまでのランダムな文字を格納する2D配列を作成するタスクが与えられました。私は乱数を行う方法を知っています。

nextvalue = random ( ) % 10001;

しかし、ランダムなキャラクターをどのように作成するか正確にはわかりません。 ASCIIを使用して、ASCIIテーブルで65から90の範囲を使用してランダムな文字を作成することができます。解決策を見つけるのを手伝ってくれる人はいますか?よろしくお願いします。

7
Nick

システムの文字エンコーディングについて何かを想定する必要があります。 [〜#〜] ascii [〜#〜] または TF-8 であると想定して、26文字の大文字ABC ... XYZラテンアルファベット。

次に、コーディングすることができます:

_ char randomletter = 'A' + (random() % 26);
_

これは [〜#〜] ebcdic [〜#〜] では機能しません。あなたも試すことができます

_ char randomletter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random () % 26];
_

[〜#〜] ebcdic [〜#〜][〜#を含むすべてのエンコーディングで機能します〜] ascii [〜#〜]UTF-8ISO -Latin-1).... whereA ... Z文字は単一のcharでエンコードされます。

しかし this は、random() % 26が間違っている理由を説明する興味深い回答です。私の素朴な非専門家の見解では、それで十分です。

定義したrandom() % 26myrandomlt26()に置き換える

_static inline unsigned myrandomlt26() {
   long l;
   do { l = random(); } while (l>=(Rand_MAX/26)*26);
   return (unsigned)(l % 26);
}
_

少し良くなるはずです(たいていの場合、上記のdo...whileループは1回実行する必要があります)。

ただし、詳細を確認してください。 nicode については、文字(または大文字)の概念が思ったほど簡単ではない人間の言語があることがわかります。

私はこれらの問題の専門家ではありませんが、都市の伝説によれば、奇妙なことに、フランスの_œ_は手紙ではなく、単なる合字であると言われています。フランスの学校で、それが手紙ではないことを(おそらく1966年から1972年に)学んだことを思い出します(ただし、合字を手書きするわけではありません-これは特別な名前を持っています) " 「フランス語-スペルミスでした)が、一部は反対を信じています。通常、_é_や_à_などのアクセント付き文字はフランス語の文字と見なされます(ただし、UTF-8エンコードでは数個連続するcharが必要です。 ...)。同様に、キリル文字 soft-sign _ь_はではない文字であることを信じて学んだ1つのように見えます。 アラビア語ヘブライ語韓国語チェロキータイ語 で文字を定義する...楽しみであり、無限の議論の問題であるべきです...

27

あなたはすでにこの問題を解決していると思います。あなたはそれについてもっと考え、いじくり回す必要があるだけです。 Cでは、任意のASCII文字をDec形式で簡単に表示できます。参考のために ASCIIテーブル を示します。たとえば、

char c = 65;
char c = 'A'; // Both are the same thing.

したがって、これはおそらく65から90までの乱数を生成することと同じです。これが役に立てば幸いです;)C++の背景を持つCも初めてです。

1
Timmay