楽しんだ者勝ち~就活を終えて伝えたいこと~

MENU

【C言語】srandの使用例①

【スポンサーリンク】

はじめに

 ここでは、乱数を発生させるsrandを紹介しています。

 

目的(求める結果)

 目的としては、srandが時間的に変化することを確認することです。乱数の生成として、同時にプログラムを回す度に、結果を変える必要がある場合を想定します。

 

乱数の生成


 特徴的な事として、

srand(time(NULL));

を使っているところです。srandはtimeに影響して、乱数を出力します。timeによって乱数が変わるか確認します。time、time*2、pow(time(NULL),10)+3.3、とtimeに任意の操作を行いました。

 

 timeの特徴として、プログラムを回すときの「時間(時刻)」に依存して数値が出力されます。結論から言うと、プログラムを回す時間をズラすことで、結果は変わります。timeを触らずともプログラムを回す時間を大幅に変えるだけで、数値は変わります。

 

結果

f:id:mottobungaku:20180926024013p:plain

 ちゃんと変わっているのが確認できます。乱数の生成は、シミュレーションなどで重要な要素です。また、任意にパターンを生成する場合などもsrandで可能です。(時刻に依存しない乱数の生成がきます)

 

コード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <time.h>

/*****define*****/
#define count  1024//回数

typedef struct complex{
 int out;
 double average;
}comp;

void rand_num0(comp rand_0[]);
void rand_num1(comp rand_1[]);
void rand_num2(comp rand_2[]);

int main(int argc, char const *argv[]) {

  int i;
  double average;
  comp rand_0[count];
  comp rand_1[count];
  comp rand_2[count];
  rand_num0(rand_0);
  rand_num1(rand_1);
  rand_num2(rand_2);
  FILE *fp;
      if((fp=fopen("test.csv","w"))==NULL){
        printf("FILE not open\n");
        return -1;
      }
      for ( i = 0; i < count; i++) {
        fprintf(fp,"%d,%d,%d\n", rand_0[i].out,rand_1[i].out,rand_2[i].out);
      }
      fprintf(fp,"\nAverage,%lf,%lf,%lf\n",rand_0[0].average,rand_1[0].average,rand_2[0].average);
      printf("End\n");
	fclose(fp);
        return 0;
}

/*****rand function0*****/
void rand_num0(comp rand_0[]) {

  int i,rand_sum;

  /* 乱数の種を初期化 */
  srand(time(NULL));

  /* 1 〜 43 のランダムな数値 */
  for ( i = 0; i < count; i++) {
    rand_0[i].out = rand() % 43 + 1;
    rand_sum  += rand_0[i].out;
  }
    rand_0[0].average = rand_sum/count;
}

/*****rand function1*****/
void rand_num1(comp rand_1[]) {

  int i,rand_sum;

  /* 乱数の種を初期化 */
  srand(2*time(NULL));

  /* 1 〜 43 のランダムな数値 */
  for ( i = 0; i < count; i++) {
    rand_1[i].out = rand() % 43 + 1;
    rand_sum  += rand_1[i].out;
  }
    rand_1[0].average = rand_sum/count;
}

/*****rand function2*****/
void rand_num2(comp rand_2[]) {

  int i,rand_sum;

  /* 乱数の種を初期化 */
  srand(pow(time(NULL),10)+3.3);

  /* 1 〜 43 のランダムな数値 */
  for ( i = 0; i < count; i++) {
    rand_2[i].out = rand() % 43 + 1;
    rand_sum  += rand_2[i].out;
  }
    rand_2[0].average = rand_sum/count;
}

 

最後に

 srandが時刻に依存して、乱数の生成を行うことを確認しました。ここでは触れていませんが、任意の乱数などもsrandでできます。シミュレーションなどでは、プログラムを回す度に数値を変える必要があったり、固定しなければならなかったりとあります。srandを使いこなすことが重要になります。ぜひ、srandをマスターしましょう。