第6講 配列
第3話 乱数系列を変えるシード値を現時刻から取得
41 67 34 0 69 24 78 58 62 64
を実現するプログラム例
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
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++) {
cout<<" "<< a[i]; //データ出力
}
cout<<endl; //改行
}
皆さん、乱数のはずなのに、
何回実行しても実行画面は
41 67 34 0 69 24 78 58 62 64
とまったく同じです。
乱数(正確には疑似乱数)といえど、でる順番は決まっているのです。
順番を変えるには、シード値を指定します。
シード値とは乱数系列を決定する値です。
乱数系列を変えるときに使います。
具体的には、
srand(*);
*に数字を入れます。
では、コードを
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
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++) {
cout<<" "<< a[i]; //データ出力
}
cout<<endl; //改行
}
と変更しましょう。
すると、実行結果は
38 19 38 37 55 97 65 85 50 12
と前と変わります。
では皆さんシード値をいろいろ変えて実験してみて下さい。
結果の一部は30行下に示します。
シード値と結果(左がシード値で、右が結果)
指定なし | 41 67 34 0 69 24 78 58 62 64 |
0 | 38 19 38 37 55 97 65 85 50 12 |
1 | 45 16 98 95 84 50 90 31 5 16 |
2 | 48 96 94 91 31 77 2 3 17 68 |
3 | 51 45 59 86 45 4 15 76 60 20 |
では、毎回自動的に乱数系列を変える方法はあるでしょうか。
あります。乱数系列のシード値を時間から取得するのです。
#include<iostream> //入出力のために組み込む
#include <ctime> //time()を使用できるようにインクルード
using namespace std; //coutを使えるようにするために必要
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++) {
cout<<" "<< a[i]; //データ出力
}
cout<<endl; //改行
}
とすればよいのです。
これ以降では乱数を使うときには、原則としてピンクを入れることにします。
#include <ctime> //time()を使用できるようにインクルード
は
#include <time.h> //time()を使用できるようにインクルード
でも大丈夫です。
.hの付いているインクルードファイルはC言語用です。
C++はC言語の拡張版ですから、
C言語用のヘッダファイル(インクルードファイル)も使えるのです。
初心者の方は、乱数系列を決定するシード値を現時刻から取得するには
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次元配列を使用して、
を実現しましょう。
条件は、2次元for文で実行することとデータは100未満のランダムな整数とします。
また、実行画面をそろえるために
srand((unsigned)time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
を一時的に外しておいて下さい。
一時的に外すよい方法は、
//srand((unsigned)time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
とすることです。つまり、//を冒頭に加えて注釈文にしてしまうのです。
エラー原因を探すために、コードを一時的に外すということをこれから頻繁に行います。
数行単位で注釈文にするためには、
/*
A;
B;
C;
*/
とします。すると、
A;
B;
C;
の3行が注釈文に変わりコンピュータは読み飛ばします。