random.c

minからmaxまでのintを返す関数です。

最初に呼び出されたとき(init = 0 のとき)はそのときの時間で乱数を初期化します。

 

sys/time.hにて、

 

struct timeval{
  time_t      tv_sec;     /* 秒 */
  suseconds_t tv_usec;    /* マイクロ秒 */
}; 

 

が定義されているので、

gettimeofday関数にて値を得、

秒とマイクロ秒を足したものを乱数として、srandで初期化しています。

秒いらないよね。

 

あとは、rand関数。

「rand() 関数は [0, RAND_MAX] の範囲の疑似乱数整数を返す。」

とあります。

実際stdlibをincludeしてprintf("%d\n", RAND_MAX)をしてみると、

2147483647
とのことです。

 

2^31-1 ですね。

このパソコンではint型は4バイト(32bit)ということです。

-2^31 〜 2^31-1 で、2^32種類の値を表せるのですね。

 

 

#ifndef _RANDOM
#define _RANDOM

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

// random int from min to max
int rnd_int(int min, int max){
   static char init = 0;
   if(!init){
      struct timeval tv;
      gettimeofday(&tv, NULL);
      srand(tv.tv_sec + tv.tv_usec);
      init = 1;
      printf("rnd_int: initialization complete!\n");
   }
   return min + rand() % (max - min + 1);
}

#endif