乱数 解答ページ | Programming Place Plus C言語編 第54章

トップページ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)
{
    srand((unsigned int)time(NULL));

    for (int i = 0; i < 10; ++i) {
        printf("%d\n", rand() % 10 - 10);
    }
}

実行結果

-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)
{
    srand((unsigned int)time(NULL));

    const char s[] = "aiueo";

    for (int i = 0; i < 10; ++i) {
        int index = rand() % (sizeof(s) - 1);
        printf("%c\n", s[index]);
    }
}

実行結果

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)
{
    srand((unsigned int)time(NULL));

    for (int i = 0; i < 10; ++i) {
        printf("%lf\n", (double)rand() / RAND_MAX);
    }
}

実行結果

0.465712
0.906034
0.394543
0.212897
0.268715
0.980255
0.474136
0.811701
0.727439
0.536241


参考リンク


更新履歴

’2018/5/3 新規作成。



第54章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る