Programming Place Plus トップページ – C言語編 – 第54章
問題① -10 ~ -1 の範囲の整数の乱数を生成するプログラムを作成してください。
本編で解説したとおり、いったん、最小値を 0
になるように考えればよいです。つまり、(-10~-1) の最小値 10 を 0
に直すために +10 します。すると (0~9) になります。これは「rand() %
10」で得られます。
そして、+10 を打ち消すために -10 します。したがって「rand() % 10 -
10」です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
( (unsigned int)time(NULL) );
srand
for( int i = 0; i < 10; ++i ){
( "%d\n", rand() % 10 - 10 );
printf}
}
実行結果
-4
-8
-9
-9
-6
-2
-7
-10
-6
-5
あるいは、1~10 の範囲の乱数を生成して、符号を反転させる方法も考えられます。ただ、-5~5 の範囲の乱数が欲しいというように、正負両方が含まれているケースでも応用が利くのは、先ほどの方法の方です。
問題② ‘a’、‘i’、‘u’、‘e’、‘o’ という5文字をランダムで選び出すプログラムを作成してください。
各文字に 0~4 の値を対応させれば、rand関数を使って実現できます。“aiueo” の入った char型の配列を用意して、乱数を添字として使うと簡単で奇麗です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
( (unsigned int)time(NULL) );
srand
const char s[] = "aiueo";
for( int i = 0; i < 10; ++i ){
int index = rand() % (sizeof(s) - 1);
( "%c\n", s[index] );
printf}
}
実行結果
e
a
o
i
u
o
u
a
a
e
問題③ 0.0~1.0 の範囲の浮動小数点数の乱数を生成するプログラムを作成してください。
rand関数は整数しか返しませんが、うまく使えば浮動小数点数の乱数を得られます。
要は、0~RAND_MAX の範囲を、0.0~1.0 の範囲に対応付ければよいです。0 -> 0.0、RAND_MAX -> 1.0 という訳ですから、rand関数が返した値を RAND_MAX で割ればよいと分かります。
ただし、rand関数の戻り値は int型なので、単に除算すると 0 ばかりになってしまいます。戻り値を double型にキャストすることが必要です。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
( (unsigned int)time(NULL) );
srand
for( int i = 0; i < 10; ++i ){
( "%lf\n", (double)rand() / RAND_MAX );
printf}
}
実行結果
0.465712
0.906034
0.394543
0.212897
0.268715
0.980255
0.474136
0.811701
0.727439
0.536241
return 0;
を削除(C言語編全体でのコードの統一)’2018/5/3 新規作成。
Programming Place Plus のトップページへ