乱数関数rand()

3894 ワード

ネット上の多くのコードの中で乱数発生関数がrandom()で使われているのを見て、コピーした後に実行しても定義されていないとエラーが表示されます.
その後、以前の本やネット上の資料を調べたが、実はC中はrand()だった.簡単な説明をします.
rand()関数は乱数を生成するランダム関数である.C言語にはsrand()関数などもあります. 
 
(1)この関数を使用するには、まず先頭にヘッダファイルstdlibを含める.h
#include(C++推奨使用#include,以下同)
(2)標準のCライブラリで関数rand()は0~RAND_を生成できるRAND_MAXはstdlibである.hで定義された整数で、システムに関連しています.
(3)rand()関数はパラメータを入力せず、式rand()で直接参照する.たとえば、次の文で2つの乱数を印刷できます.
printf("Random numbers are: %i %i",rand(),rand());
(4)rand()関数は指定された順序で整数を生成するので,上記の文を実行するたびに同じ2つの値が印刷されるので,C言語のランダムは本当の意味でのランダムではなく,擬似乱数とも呼ばれる場合がある.
(5)プログラムが実行されるたびに新しいシーケンスのランダム値を生成できるように,通常,乱数生成器に新しいランダムシードを提供する.関数srand()(stdlib.hから)は、乱数ジェネレータにシードを拡散することができる.シードが異なるrand()関数であれば、異なる乱数シーケンスが生成されます.srand()は乱数生成器の初期化器と呼ばれる.
 
以下は短いC例で、C++は似ていて、興味のあるのは自分で実現することができます.
 1 #include <stdio.h>

 2 #include <stdlib.h>

 3 int main()

 4 {

 5    unsigned int seed; /*         ,   usigned int   */

 6    int k;

 7    printf("Enter a positive integer seed value: 
"); 8 scanf("%u",&seed); 9 srand(seed); // 10 printf("Random Numbers are:
"); 11 for(k = 1; k <= 10; k++) 12 { 13 printf("%i",rand()); 14 printf("
"); 15 } 16 return 0; 17 }

提供されるシードが同じである場合、乱数シーケンスも同じである.また、シードが1の場合、srand()関数を使用しない場合と同様、すなわちrand()関数のデフォルトでは初期化シード値は1である.
stdlib.hの2つの関数のプロトタイプは:
int rand();
void srand (unsigned int);
srand(time(0)); i=rand();
またはsrand(time(null);
このようにiは本当の意味での乱数である.
rand()は擬似乱数を生成し、srand関数はシードを提供し、シードによって生成される乱数のシーケンスも異なるため、通常はsrand関数time(0)を呼び出してシステムの時間(1970.1.1真夜中から)を返し、単位:秒、シードによって当然生成される乱数の同じ確率は小さい.