C   乱数

ホーム   C/C++チュートリアル


rand( )

C では、rand( )という関数で乱数を作ります。

rand.c


#include <stdio.h>
#include <stdlib.h>   // for rand() RAND_MAX

int main()
{
    for ( int i=1; i <= 4; i++) {
        printf("%d\n", rand());
    }
    printf("RAND_MAX is %d\n", RAND_MAX);
    
    return 0;
}
    

実行結果


// 1回目
16807
282475249
1622650073
984943658
RAND_MAX is 2147483647

// 2回目
16807
282475249
1622650073
984943658
RAND_MAX is 2147483647

// 3回目
16807
282475249
1622650073
984943658
RAND_MAX is 2147483647
    

実行結果は毎回同じです。

コード説明

  1. 「#include <stdlib.h>」stdlib.hには 乱数のために必要な関数や定数が定義されています。
  2. stdlib.h には、rand( )関数、RAND_MAX、それと後ほど出てくる srand( )関数が定義されています。
  3. rand( )関数によって 0 から RAND_MAXまでの整数の乱数が得られます。
  4. RAND_MAXは値の設定された定数です。macOSとLinuxでは2147483647(約21億)が設定されています。Windowsでは32767が設定されています。
  5. 2145483647という数値は、32bitコンピュータでのint 型の最大値です。32767は、short 型の最大値です。
  6. 統一をはかるために、32bit、64bitに関係なく、この値が設定されているみたいです。
  7. このプログラムは何回実行しても、実行結果が同じになります。
  8. コンピューターは、実際には乱数を作ることができません。
  9. rand( )関数は、毎回同じ初期値から得られた乱数表の数字を取得しているだけです。


そこで、毎回初期値を変えてやることで、より乱数っぽくなります。

srand( )

srand.c


#include <stdio.h>
#include <time.h>     // for time
#include <stdlib.h>   // for rand, srand

int main()
{
    srand(time(NULL)); // この行だけが追加されています。
    for ( int i=1; i <= 4; i++) {
        printf("%d\n", rand());
    }
    printf("RAND_MAX is %d\n", RAND_MAX);
    
    return 0;
}
    

実行結果


// 1回目
278588975
730552365
1229588656
461406311
RAND_MAX is 2147483647。

// 2回目
279345290
557036688
1234397943
1834197981
RAND_MAX is 2147483647。

// 3回目
279983956
553677915
618074954
607351339
RAND_MAX is 2147483647
    

毎回似たような数字が並びますが、微妙に違う値です。

コード説明

  1. 「#include <time.h>」は、time.h には、 time( )関数などの時間に関する関数が定義されています。
  2. 「srand(time(NULL));」。srand( )がrand( )の初期値を設定する関数です。引数に何の値を初期値にするか指定します。
  3. 乱数の初期値としては、現在時刻が用いられることが多いです。時刻は毎回変わります。
  4. time( )関数は、1970年1月1日から現在までの経過時間を秒として返します。引数は、特に必要ありませんが、空白ではエラーになりますので、NULLを指定することが一般的です。


しかし、まだまだ乱数らしくないです。値も大きすぎます。 そこでもう少し工夫します。

乱数の整形

random.c


#include <stdio.h>
#include <time.h>     // for time
#include <stdlib.h>   // for rand, srand

int main()
{
    srand(time(NULL));
    for ( int i=1; i <= 4; i++) {
        printf("%d\n", rand() % 1000 + 1);  // この行が変更されています
    }
    printf("RAND_MAX is %d\n", RAND_MAX);
    
    return 0;
}
    

実行結果


// 1回目
393
314
678
429
RAND_MAX is 2147483647

// 2回目
919
855
581
97
RAND_MAX is 2147483647

// 3回目
761
349
784
104
RAND_MAX is 2147483647
    

だいぶ乱数っぽくなりました。

コード説明

  1. 「rand( ) % 1000 + 1」。rand( )で得られた数値を1000で割った余りは、0 から 999 になります。
  2. その値に 1 を足せば、1 から 1000 の値になります。



27617 visits
Posted: Dec. 23, 2019
Update: Dec. 23, 2019

ホーム   C/C++チュートリアル   目次