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
$
関連記事