tomyamaのブログ

日記・雑記。

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

C言語の srand() 関数のサンプルプログラムです。

srand()関数は、疑似乱数を返す rand()関数の開始点を設定します。

逆に言うと、srand()関数をコールしないと、rand()関数は毎回同じ所から開始する事になります。その事を確認するプログラムを書いてみます。

 

  • srand()関数: 疑似乱数整数系列の新しい種を指定する
    • #include <stdlib.h>
    • void srand( unsigned seed );

目次


サンプルコード

[srand.c]

#include <stdio.h>          /* printf() */
#include <stdlib.h>         /* rand(), srand() */
#include <time.h>           /* time() */


/* 乱数列を初期化するマクロ */
#define RANDOMIZE()     (srand(time(NULL)))
/* 0~(x-1)の乱数を生成するマクロ */
#define RANDOM(x)       (rand()%(x))


void prt( void )
{
    int     i;
    for( i=1; i<=5; i++ ){
        printf( " %2d: %5d\n", i, RANDOM( 100 ) );
    }
    return;
}


int main( int argc, char *argv[] )
{
    printf( "before srand()\n" ) ;
    prt();      /* srand()前: 【同じ値】 */

    RANDOMIZE();

    printf( "after  srand()\n" );
    prt();      /* srand()後: 【違う値】 */

    return 0;
}

 

実行例

Windows 10, Visual Studio 2022, x86 Native Tools Command Prompt

>set CFLAGS=/nologo /source-charset:utf-8 /execution-charset:shift_jis
>cl %CFLAGS% /Fe:srand_msvc srand.c
rand.c
>
>srand_msvc.exe    ← 1回目の実行
before srand()
  1:    41
  2:    67
  3:    34
  4:     0
  5:    69
after  srand()
  1:    22
  2:    13
  3:    76
  4:    22
  5:    19
>srand_msvc.exe    ← 2回目の実行
before srand()
  1:    41      ← 1回目と同じ値を返されている
  2:    67        
  3:    34
  4:     0
  5:    69
after  srand()
  1:    35      ← srand()関数の呼びだし後は違う値
  2:    39        
  3:    97
  4:    72
  5:    10
>

 

CentOS Stream 9, gcc (GCC) 11.3.1

$ gcc -Wall -O2 -o srand_centos9 srand.c
$
$ ./srand_centos9    ← 1回目の実行
before srand()
  1:    83
  2:    86
  3:    77
  4:    15
  5:    93
after  srand()
  1:    83
  2:    43
  3:    11
  4:    37
  5:    34
$ ./srand_centos9   ← 2回目の実行
before srand()
  1:    83      ← 1回目と同じ値を返されている
  2:    86       
  3:    77
  4:    15
  5:    93
after  srand()
  1:    39      ← srand()関数の呼びだし後は違う値
  2:    46       
  3:    68
  4:    85
  5:    20
$

 

Cygwin 3.3.6-1, gcc (GCC) 11.3.0

$ gcc -Wall -O2 -o srand_cygwin srand.c
$
$ ./srand_cygwin.exe    ← 1回目の実行
before srand()
  1:    33
  2:    43
  3:    62
  4:    29
  5:     0
after  srand()
  1:    25
  2:    11
  3:     2
  4:    31
  5:    43
$ ./srand_cygwin.exe   ← 2回目の実行
before srand()
  1:    33      ← 1回目と同じ値を返されている
  2:    43       
  3:    62
  4:    29
  5:     0
after  srand()
  1:    29      ← srand()関数の呼びだし後は違う値
  2:    89       
  3:    58
  4:    34
  5:     2
$

 

Android, Termux 0.118.0, clang 15.0.2

$ gcc -Wall -O2 -o srand_termux srand.c
$
$ ./srand_termux    ← 1回目の実行
before srand()
  1:    83
  2:    86
  3:    77
  4:    15
  5:    93
after  srand()
  1:    47
  2:    85
  3:    15
  4:    49
  5:    73
$ ./srand_termux   ← 2回目の実行
before srand()
  1:    83      ← 1回目と同じ値を返されている
  2:    86       
  3:    77
  4:    15
  5:    93
after  srand()
  1:    72      ← srand()関数の呼びだし後は違う値
  2:    86       
  3:    55
  4:    17
  5:    21
$


関連記事