C言語の rand()関数のサンプルプログラムです。
rand()関数は、0 から RAND_MAX までの整数を返します。決まりきった事を実行する事が得意なコンピューターにとって、乱数を生成するのは難しい作業です。そのため実際には純粋にランダムな数字では無く、疑似乱数を返しています。つまり、あらかじめ決められた数値を順番に返しています。この事は『srand()関数のサンプルコード』の記事で確認しているのでそちらも読んでみて下さい。
今回のサンプルコードでは、rand()関数が偏りが少ない均一的な数値を返してくれる事が判るように書いてみました。
- rand() 疑似乱数を返す
- #include <stdlib.h>
- int rand( void );
- rand()関数は、呼び出されるたびに 0 から RAND_MAX までの整数を返します。RAND_MAX は stdlib.h ファイルで定義されていて、ANSI C標準では少なくとも 32,767 の値を持つと定義されています。
目次
サンプルコード
[rand.c]
#include <stdio.h> /* printf(), puts(), fputs */
#include <stdlib.h> /* rand(), srand() */
#include <time.h> /* time() */
/* 乱数列を初期化するマクロ */
#define RANDOMIZE() (srand(time(NULL)))
/* 0~(x-1)の乱数を生成するマクロ */
#define RANDOM(x) (rand()%(x))#define TEST_CYCLE 2000 /* rand()関数を呼び出す回数 */
#define NMAX 50 /* 乱数の上限サイズ( 0 から (NMAX-1) の整数を返す) */
int main( void )
{
static int kekka[ NMAX ];
int idx;
int val;for( idx=0; idx<NMAX; idx++ )
kekka[ idx ] = 0; /* 結果格納テーブルを初期化する */RANDOMIZE(); /* 乱数列を初期化する */
for( idx=0; idx<TEST_CYCLE; idx++ ){
val = RANDOM( NMAX );
kekka[ val ]++;
}/* 集計結果をグラフ表示する */
puts( " 1 2 3 4 5" );
puts( " 0 + 0 + 0 + 0 + 0 + 0" );
for( idx=0; idx<NMAX; idx++ ){
printf( "%5d: ", idx );
while( kekka[ idx ] ){
fputs( "#", stdout );
kekka[ idx ]--;
}
fputs( "\n", stdout );
}
puts( " 0 + 1 + 2 + 3 + 4 + 5" );
puts( " 0 0 0 0 0 0" );return 0;
}
実行例
サンプルコードでは、2000回のrand()関数の呼び出し毎に、50の大きさの中で分散した乱数を得ています。綺麗に分散した乱数を得ていたとすれば、0 から 49 の各数値の発生数は、2000 / 50 で 40回 となります。つまり、40回を中心にどの程度ずれているのかが確認のポイントとなります。
Windows 10, Visual Studio 2022, x86 Native Tools Command Prompt
>set CFLAGS=/nologo /source-charset:utf-8 /execution-charset:shift_jis
>cl %CFLAGS% /Fe:rand_msvc rand.c
rand.c
>
>rand_msvc.exe
1 2 3 4 5
0 + 0 + 0 + 0 + 0 + 0
0: #############################################
1: #####################################################
2: ##############################################
3: ###########################################
4: ########################################
5: ##################################
6: ##############################################
7: ##################################################
8: ###################################
9: #################################
10: #################################################
11: ##################################
12: ###########################################
13: #################################
14: #####################################
15: #####################################
16: ######################################
17: ############################
18: ###########################################
19: #########################################
20: ##########################################
21: ####################################
22: ##############################
23: ###################################
24: ##############################
25: ##########################################
26: ##############################################
27: ############################################
28: ###################################
29: ##############################################
30: ###############################################
31: #######################################
32: #########################################
33: ##############################
34: ########################################
35: ###############################################
36: ########################################
37: ###############################################
38: ####################################
39: ##############################################
40: ######################################
41: ############################################
42: ######################################
43: ###################################
44: ###################################################
45: ######################################
46: ##################################
47: #######################################
48: ###############################
49: #############################################
0 + 1 + 2 + 3 + 4 + 5
0 0 0 0 0 0
>
CentOS Stream 9, gcc (GCC) 11.3.1
$ gcc -Wall -O2 -o rand_centos9 rand.c
$
$ ./rand_centos9
1 2 3 4 5
0 + 0 + 0 + 0 + 0 + 0
0: #############################################
1: #########################
2: ######################################
3: ############################################
4: ##################################################
5: ###########################
6: ###############################################
7: #########################################
8: ################################
9: ##############################
10: ###############################################
11: ###################################################
12: #######################################
13: #########################################
14: #############################
15: ###################################
16: ##############################
17: #############################################
18: ###########################################
19: #################################
20: #######################################
21: ###############################
22: ################################
23: ########################################
24: ################################
25: ##################################
26: ########################################
27: ####################################################
28: ###############################################
29: ########################################
30: ################################################
31: #################################################
32: #########################################
33: #############################################
34: ###########################################
35: ############################################
36: ################################
37: #####################################
38: ##################################################
39: #####################################
40: ###########################################
41: ################################################
42: ##############################################
43: ####################################
44: ################################################
45: #######################################
46: ##########################################
47: ################################
48: ########################################
49: #########################################
0 + 1 + 2 + 3 + 4 + 5
0 0 0 0 0 0
$
Cygwin 3.3.6-1, gcc (GCC) 11.3.0
$ gcc -Wall -O2 -o rand_cygwin rand.c
$
$ ./rand_cygwin.exe
1 2 3 4 5
0 + 0 + 0 + 0 + 0 + 0
0: #################################
1: ###################################
2: ########################################
3: ############################
4: ###################################
5: #######################################
6: #################################
7: #########################################
8: #########################################
9: #########################################
10: ########################################
11: ############################################
12: ###############################################
13: ##############################################
14: ########################################
15: ################################################
16: #######################################################
17: ####################################################
18: ##############################
19: ########################################
20: ######################################
21: ############################
22: #################################
23: #########################################
24: ####################################
25: ################################################
26: ##############################
27: #########################################
28: #########################################
29: ###########################################
30: ##############################
31: #################################################
32: ###########################################
33: #########################################
34: ##################################
35: ##################################
36: #############################################
37: ############################################
38: #####################################################
39: ############################################
40: #####################################
41: ###############################################
42: ################################################
43: ##############################################
44: ##########################
45: ####################################
46: ####################################
47: ###################################
48: ###########################################
49: ##########################################
0 + 1 + 2 + 3 + 4 + 5
0 0 0 0 0 0
$
Android, Termux 0.118.0, clang 15.0.2
$ gcc -Wall -O2 -o rand_termux rand.c
$
$ ./rand_termux
1 2 3 4 5
0 + 0 + 0 + 0 + 0 + 0
0: ##################################
1: ########################################
2: ##############################################
3: ################################################
4: ##########################################
5: ###########################################
6: ################################
7: ###########################
8: ##################################################
9: #########################################
10: ####################################
11: ################################################
12: ####################################################
13: ###################################
14: #########################################
15: ######################################
16: ####################################
17: #########################################
18: ####################################
19: ###########################
20: ###########################################
21: ###########################################
22: #####################################################
23: ##########################################
24: #######################################
25: ###################################
26: ###############################################
27: ###########################################
28: ################################################
29: ##################################
30: ###############################################
31: ###########################################
32: #######################################
33: ########################################
34: ###############################
35: ############################################
36: ##############################################
37: #############################################
38: ###############################################
39: ################################
40: #########################################
41: ############################################
42: #############################################
43: ####################
44: #######################################
45: ###################################
46: ################################
47: ######################################
48: ###############################
49: #########################################
0 + 1 + 2 + 3 + 4 + 5
0 0 0 0 0 0
$
極端な偏りは発生していない事が判ると思います。今回は2000回の呼び出し回数でテストしましたが、呼び出し数を増やせば更に均等にばらけてくれるかもしれません。
関連記事