tomyamaのブログ

日記・雑記。

C言語 rand()関数のサンプルコード

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回の呼び出し回数でテストしましたが、呼び出し数を増やせば更に均等にばらけてくれるかもしれません。


関連記事