サイタパソコン教室・IT資格情報処理技術者試験対策講座基本情報技術者試験 神奈川 基本情報技術者試験対策セミナー レッスンノート C言語における乱数の取り扱い

C言語における乱数の取り扱い

基本情報技術者試験対策講座のレッスンノート

レッスンノートって?レッスンノートって?

8/10のレッスン内容は、以下の通りです。

 ・ C言語における乱数の取り扱い
  - 指定範囲の乱数を求める計算式

詳細は、紙でお渡ししたノートも参照してください。

□ C言語における乱数の取り扱い

プログラミングでは、厳密な乱数ではなく「擬似乱数列」と呼ばれる配列を使って乱数を扱います。

その際、以下の2つの標準関数を使います。

 ・ srand()
 ・ rand()

srand()は、擬似乱数列の中の位置を決めるための関数です。

渡された引数に依存して、この位置が決まります。現在時刻(1970年を起点とした経過秒数)を引数として

 srand(time(NULL));

と記すことが多いようです。

一方rand()は、擬似乱数列の現在位置(初期状態は、srand()の呼び出しで決まった位置)にある数値を取得する関数です。

数値を取得すると、現在位置が次の数値に移るようになっています。


ここで、以下のソースコードを見てみましょう。

 for(i=0; i<8; i++) {
  srand(time(NULL));
  a[i] = rand();
 }

このループは8周ですが、これは1秒よりも格段に速く回りきってしまいます。

そうなると、以下のように動作してしまいます。

 (a) srand()で指定される位置が毎回同じ
 (b) rand()では(a)で指定された同じ位置にある数値を取得していた

そこで、srand()をfor文の前に出して、

 srand(time(NULL));

 for(i=0; i<8; i++) {
  a[i] = rand();
 }

と修正すれば、すべての要素に別々の数値が入るようになります。

現在時刻を引数にしてsrand()を使う場合は、使用間隔を遅延処理などを使って1秒以上にする必要があります。


○ 指定範囲の乱数を求める計算式

指定範囲の乱数を求める計算式は、以下のようになります。

 乱数値 = 最小値 + rand() % (指定範囲の整数の個数);

指定範囲の整数の個数は、

 最大値 - 最小値 + 1

で求めることができますね。

目的・種類別に基本情報技術者試験対策・合格講座を探す

新着レッスンノート

12/11 のレッスン内容は、以下の通りです。  ・ C言語文法   - 条件演算   - (*a)++; の動き方   - a = b = c; の動き方 詳細は、紙でお渡ししたノートも参照してください。 □ C言語文法 引き続き、ソースコードの読解問題を題材に...

12/5の体験レッスンの内容は、以下の通りです。  ・ ガイダンス  ・ 基本情報技術者試験の概要   - 出題形式   - 出題の種類 詳細は、別途お渡ししたノートも参照してください。 □ ガイダンス 冒頭で、現状の確認を兼ねてガイダンスを実施しました。 ...

11/27 のレッスン内容は、以下の通りです。  ・ マルチバイト文字   - ワイド文字   - 定数表現のプレフィックス・サフィックス 詳細は、紙でお渡ししたノートも参照してください。 □ マルチバイト文字 今回のテーマは、マルチバイト文字です。 マルチバ...

11/6 のレッスン内容は、以下の通りです。  ・ 文字列の配列   - 2次元配列を使う場合   - ポインタの配列を使う場合 詳細は、紙でお渡ししたノートも参照してください。 □ 文字列の配列 今回も、C言語プログラミングの中級編の問題を題材にレッスンを進めまし...

10/28 のレッスン内容は、以下の通りです。  ・ C言語の読解練習   - strdump()の役割   - 数値の2進数表示処理 詳細は、紙でお渡ししたノートも参照してください。 □ C言語の読解練習 今回も、C言語プログラミングの中級編の問題を題材にレッスン...

レッスンノート ページ先頭へ

基本情報技術者試験情報

サイタの基本情報技術者試験講師がブログを通して、基本情報技術者試験情報を発信。更新情報のチェックはこちらから!