Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - 一般ユーティリティライブラリ」です。

C言語プログラミング入門

14. ライブラリ関数(32/36) - ユーティリティライブラリ(5/5)

14.44 乱数の生成関数

14.44.1 rand関数、srand関数

rand関数は0からRAND_MAXの範囲の疑似乱数整数を生成し、srand関数は疑似乱数整数の種(ランダムシード)を設定します。

【表14-7-10】 rand関数、srand関数
形式#include <stdlib.h>
int rand(void);
void srand(unsigned int seed);
返り値rand関数は生成した疑似乱数整数を返します。srand関数の返り値はありません。
引数
unsigned int seed
疑似乱数整数の種(ランダムシード)を指定します。

srand関数でランダムシードを設定していない場合のランダムシードは1です。また、ランダムシードが同じであればrand関数の生成する疑似乱数整数は同じ値になります。

14.44.2 例題

じゃんけんをします。グーは1、チョキは2、パーは3を入力します。0を入力したら終了します。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main(void)
  6. {
  7.     unsigned int   seed;
  8.     int            gcp;
  9.     int            my_gcp;
  10.  
  11.     /* 紀元からの経過秒数をランダムシードとして設定 */
  12.     seed = time(NULL);
  13.     srand(seed);
  14.  
  15.     /* 0が入力されるまで */
  16.     while(1)
  17.     {
  18.         do
  19.         {
  20.             printf("1(グー)、2(チョキ)、3(パー) ==> ");
  21.             scanf("%d", &gcp);
  22.         }
  23.         while(gcp < 0 || gcp > 3);
  24.  
  25.         if (gcp != 0)
  26.         {
  27.             /* 1から3の範囲の乱数を生成 */
  28.             my_gcp = 1 + (int) (3.0 * rand() / (RAND_MAX + 1.0));
  29.  
  30.             switch (my_gcp)
  31.             {
  32.                 case 1:
  33.                     printf("グー。\t");
  34.                     break;
  35.                 case 2:
  36.                     printf("チョキ。\t");
  37.                     break;
  38.                 default:
  39.                     printf("パー。\t");
  40.             }
  41.  
  42.             /* 勝敗の判定 */
  43.             if (my_gcp == gcp)
  44.             {
  45.                 printf("あいこです。\n");
  46.             }
  47.             else
  48.             {
  49.                 switch (my_gcp)
  50.                 {
  51.                     case 1:                        /* グー */
  52.                         if (gcp == 2)
  53.                         {
  54.                             printf("こちらの勝ちです。\n");
  55.                         }
  56.                         else
  57.                         {
  58.                             printf("あなたの勝ちです。\n");
  59.                         }
  60.                         break;
  61.                     case 2:                        /* チョキ */
  62.                         if (gcp == 1)
  63.                         {
  64.                             printf("あなたの勝ちです。\n");
  65.                         }
  66.                         else
  67.                         {
  68.                             printf("こちらの勝ちです。\n");
  69.                         }
  70.                         break;
  71.                     default:                       /* パー */
  72.                         if (gcp == 1)
  73.                         {
  74.                             printf("こちらの勝ちです。\n");
  75.                         }
  76.                         else
  77.                         {
  78.                             printf("あなたの勝ちです。\n");
  79.                         }
  80.                 }
  81.             }
  82.         }
  83.         else
  84.         {
  85.             break;
  86.         }
  87.     }
  88.  
  89.     return 0;
  90. }
$ ./ex14_7_4.prg
1(グー)、2(チョキ)、3(パー) ==> 1
パー。  こちらの勝ちです。
1(グー)、2(チョキ)、3(パー) ==> 2
チョキ。  あいこです。
1(グー)、2(チョキ)、3(パー) ==> 3
パー。  あいこです。
1(グー)、2(チョキ)、3(パー) ==> 4
1(グー)、2(チョキ)、3(パー) ==> 3
チョキ。  こちらの勝ちです。
1(グー)、2(チョキ)、3(パー) ==> 2
チョキ。  あいこです。
1(グー)、2(チョキ)、3(パー) ==> 1
チョキ。  あなたの勝ちです。
1(グー)、2(チョキ)、3(パー) ==> 0
$
13行目
time関数で取得した紀元からの経過秒数をsrand関数でランダムシードとして設定します。
28行目
rand関数で乱数を生成して1から3の範囲の値に変換します。

14.45 その他の関数

14.45.1 getenv関数

getenv関数は指定した環境変数の値を取得します。

【表14-7-11】 getenv関数
形式#include <stdlib.h>
char *getenv(const char *name);
返り値指定した環境変数の値を返します。指定した環境変数が存在しない場合はNULLを返します。
引数
const char *name
環境変数の名前を指定します。

14.45.2 system関数

system関数は指定したコマンドを実行します。コマンドが終了するまでこの関数は待ち状態になり、割り込み(SIGINTとSIGQUIT)も無視します。

【表14-7-12】 system関数
形式#include <stdlib.h>
int system(const char *command);
返り値コマンドの終了ステータスを返します。エラーの場合は-1を返します。
引数
const char *command
実行するコマンドを指定します。

14.45.3 例題

実行時引数で指定したファイルの内容に行番号を付加して表示します。表示はprコマンドで行います。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(int argc, char **argv)
  6. {
  7.     char    pr_command[] = "pr --number-lines=:3 -T ";
  8.     char    *p_command;
  9.     int     status;
  10.  
  11.     if(argc != 2)
  12.     {
  13.         printf("実行時引数が不当です。\n");
  14.         exit(EXIT_FAILURE);
  15.     }
  16.  
  17.     /* 実行するコマンドを作成 */
  18.     if((p_command = (char *)malloc(
  19.         strlen(pr_command) + strlen(*(argv + 1)) + 1)) != NULL)
  20.     {
  21.         *p_command = '\0';
  22.         strcat(p_command, pr_command);
  23.         strcat(p_command, *(argv + 1));
  24.     }
  25.     else
  26.     {
  27.         printf("コマンドを作成できません。\n");
  28.         exit(EXIT_FAILURE);
  29.     }
  30.  
  31.     /* コマンドを実行 */
  32.     status = system(p_command);
  33.  
  34.     free(p_command);
  35.  
  36.     return status;
  37. }
$ cat /etc/issue
Fedora release 10 (Cambridge)
Kernel \r on an \m (\l)

$
$ ./ex14_7_5.prg /etc/issue
  1:Fedora release 10 (Cambridge)
  2:Kernel \r on an \m (\l)
  3:
$
21〜23行目
ファイルの内容を表示するprコマンドを作成します。コマンドの形式は「pr --number-lines=:3 -T ファイルパス名」です。
32行目
コマンドを実行します。