第6講 配列
第3話 乱数系列を変えるシード値を現時刻から取得
41 67 34 0 69 24 78 58 62 64
を実現するプログラム例
#include<stdio.h> //prinf()を使えるようにするためにインクルード
#include<stdlib.h> //rand()を使用できるようにインクルード
void f();
int main() {
  f();
  return(0);
}
void f() {
  int a[10], i; //配列aと制御変数iの宣言
  for (i = 0; i < 10; i++) {
    a[i] = rand() % 100; //100未満のランダムな整数を生成
  }
  for (i = 0; i < 10; i++) {
    printf(" %d ", a[i]); //データ出力
  }
  printf("\n");
}

皆さん、乱数のはずなのに、
何回実行しても実行画面は
41 67 34 0 69 24 78 58 62 64
とまったく同じです。
乱数(正確には疑似乱数)といえど、でる順番は決まっているのです。
順番を変えるには、シード値を指定します。
シード値とは乱数系列を決定する値です。
乱数系列を変えるときに使います。
具体的には、
  srand(*);
*に数字を入れます。
では、コードを
#include<stdio.h> //prinf()を使えるようにするためにインクルード
#include<stdlib.h> //rand()を使用できるようにインクルード
void f();
int main() {
  f();
  return(0);
}
void f() {
  int a[10], i; //配列aと制御変数iの宣言
  
srand(0); //シード値を指定
  for (i = 0; i < 10; i++) {
    a[i] = rand() % 100; //100未満のランダムな整数を生成
  }
  for (i = 0; i < 10; i++) {
    printf(" %d ", a[i]); //データ出力
  }
  printf("\n");
}
と変更しましょう。
すると、実行結果は
38 19 38 37 55 97 65 85 50 12
と前と変わります。
では皆さんシード値をいろいろ変えて実験してみて下さい。
結果の一部は30行下に示します。

































シード値と結果(左がシード値で、右が結果)

指定なし 41 67 34 0 69 24 78 58 62 64
38 19 38 37 55 97 65 85 50 12
1 45 16 98 95 84 50 90 31 5 16 
48 96 94 91 31 77 2 3 17 68 
51 45 59 86 45 4 15 76 60 20 

では、毎回自動的に乱数系列を変える方法はあるでしょうか。
あります。乱数系列のシード値を時間から取得するのです。
#include<stdio.h> //prinf()を使えるようにするためにインクルード
#include<stdlib.h> //rand()を使用できるようにインクルード
#include <time.h> //time()を使用できるようにインクルード
void f();
int main() {
  f();
  return(0);
}
void f() {
  int a[10], i; //配列aと制御変数iの宣言
  
srand((unsigned)time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
  for (i = 0; i < 10; i++) {
    a[i] = rand() % 100; //100未満のランダムな整数を生成
  }
  for (i = 0; i < 10; i++) {
    printf(" %d ", a[i]); //データ出力
  }
  printf("\n");
}
とすればよいのです。
これ以降では乱数を使うときには、原則としてピンクを入れることにします。

初心者の方は、乱数系列を決定するシード値を現時刻から取得するには
  srand((unsigned)time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
とするものだ、と思って下さい。
お呪いであると思って下さい。
一気にすべてを理解しようとする姿勢は禁物です。

配列は
  int a[3][4]; //2次元配列の宣言
とすると、2次元配列となります。
2次元という意味は、
a[0][0],a[0][1],a[0][2],a[0][3],
a[1][0],a[1][1],a[1][2],a[1][3],
a[2][0],a[2][1],a[2][2],a[2][3]
と縦と横を持つ配列になるからです。
3行4列配列と呼びます。
では、この2次元配列を使用して、
001
を実現しましょう。
条件は、2次元for文で実行することとデータは100未満のランダムな整数とします。
また、実行画面をそろえるために
  srand((unsigned)time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
を一時的に外しておいて下さい。
一時的に外すよい方法は、
  
//srand((unsigned)time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
とすることです。つまり、//を冒頭に加えて注釈文にしてしまうのです。
エラー原因を探すために、コードを一時的に外すということをこれから頻繁に行います。
数行単位で注釈文にするためには、
  /*
  A;
  B;
  C;
  */
とします。すると、
  A;
  B;
  C;
の3行が注釈文に変わりコンピュータは読み飛ばします。

第2話へ   第4話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ