str[20]という名前の文字配列に格納されるはずのランダムな160ビット文字列を生成しようとしています。配列が20文字を保持していることは明らかです。160ビットを20文字/数字に変更するにはどうすればよいですか?私はCでこれを行おうとしています。アイデアが足りなくなったので、どんな助けでも大歓迎です。その後、私のユニのヘルプデスクは私を助けません。
3 に答える
これは homwork のように見えるので、基本的なことだけを説明します。
変数は次のようになります。
char str[20];
この配列はdata のバイトを保持することに注意してください。必ずしも「文字」ではありません (文字、数字、および句読点は、文字という言葉を通常理解しているためです)。
課題が独自の乱数発生器を作成することでない限り、C のランタイム疑似乱数発生器 ( stdlib.h
) を使用し、その関数の 2 つを使用することができます:srand()
とrand()
. srand()
ジェネレーターを「シード」するために使用されます (再現性を得るために同じ値をシードするか、デバッグ中に役立つか、変数 (通常はシステム時間に関連する) をシードして真の乱数を取得します) rand()
は、整数のランダム値を生成するために使用されます。
rand() は 0 から RAND_MAX までの値 (「大きな」数値) を生成するため、適切な量を取得するにはモジュロを使用する必要がある場合があります。例えば
str[0] = char(rand() % 256); // またはそのようなもの。
ただし、rand() は 20 バイトの整数を生成しないため、いくつかの rand 値を取得して、それらを配列に適切に収める必要があります。最も簡単な方法は、rand を 20 回呼び出し、毎回 1 バイトを格納することですが、str の一部へのポインターを使用して、一度に複数のバイトを格納することもできます。
160 ビットは 20 バイトなので、20 文字の文字列に収まります。
N が行内のすべてのビットを含む数値である場合、次のようなループを記述できます。
int i;
for (i=0; i<20; i++) {
str[i] = (char)(N & 0xFF);
N >>= 8;
}
編集: Cには、すべてのビットを連続して保持できるデータ型は実際にはありません。したがって、ビットの一部を含む変数ごとに、ループをいくつかのサブループに分割する必要があります。
一方、オンザフライで一度に 1 ビットを生成している場合、コードは次のようになります (ランダム関数が「random()」と呼ばれ、0 または 1 の int を返すと仮定します)。
int i, j, b;
for (i=0; i<20; i++)
{
b = 0;
for (j=0; j<8; j++)
{
b |= (random() & 1);
b <<= 1;
}
str[i] = (char)b;
}
ランダムな印刷可能な文字列。印刷可能かどうか気にしない場合は、min((int)' ') の呼び出しを削除してください。適切な c-string にするために null ターミネータを使用していることに注意してください。これが必要ない場合は、最後の文字を null にする部分を削除するだけです (そして、その部分がそれを出力します。 null ターミネータ)
#include <stdlib.h>
int main()
{
char* str[20];
int i;
for (i = 0; i < 19; i++)
{
char[i] = min((int)' ', rand() % CHAR_MAX);
}
char[19] = '\0';
puts(str);
}