【C言語】 乱数

乱数
ランダムに変わる乱数を用いれば,おみくじやジャンケンなどのゲームに応用できます。
   

乱数  について
  
 乱数の値を得るには
       rand() を使えば簡単に得られます。

※ rand関数には  #include<string.h> が必要です。
   

《 test029.c 》

#include <stdio.h>
#include <stdlib.h>
int main(void){
int a ;
for(a=0;a<5;a++)
    printf("%d\n", rand());
}

結果  
   
         それぞれの WEB版 IED で 上記 プログラムを実行してみました。
     

      • Codingground
           
           
      • replot

         
           

      • paiza.io

              
            

      • Eclipse

         
            

 WEB版 IED は 全て同じ乱数の値になり、Eclipseは値が異なるものの 何度もプログラの実行を押しても同じ値になります。この乱数は疑似乱数と呼ばれ「規則性のないランダムな値」にはなりません。この線形合同法と言う計算によってランダムな値がえられますが、この線形合同法数列は周期的にパターンを繰り返す事になります。この周期つまり乱数の発生頻度が長ければ乱数としては使えるものになります。また、この計算式の元になる値を種と言い種を替える事により毎回異なった乱数が得られます。
   

○ srand() 関数
  乱数のパターンが替えられます。 
   

《 test030.c 》

#include <stdio.h>
#include <stdlib.h>
int main(void) {
       srand(500);
for(a=0;a<5;a++)
       printf("%d\n", rand());
}

○ 結果

    srand() 関数を加える事により、乱数のパターンは変わり、種は 500 から異なる種(異なる値) にすれば乱数のパターンも変わります。しかし、やはりプログラムの実行を押しても同じ値になります。種を定数から 動的な値 にすれば、この問題は解決します。毎回変わるものつまり、時間を使えばいいのです。
      

     

○ srand((unsigned int)time(NULL));
    
  時間的要因を加えることによりプログラム実行を押せば毎回異なった値になります。

 timeには #include<time.h> が必要です。
    
《 test031.c 》

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int main(void)
{
int a ;
srand((unsigned int)time(NULL));
for(a=0;a<5;a++)
     printf("%d\n", rand());
}

○ 結果
   
これで乱数が使えるようになりました。

     

乱数 の 発生パターン 
    • 0~1.0の範囲​
          
      (double)rand()/(double)RAND_MAX​
         
      ※ (double) 整数から実数へ変換
        RAND_MAX 乱数の最大値

  • min~maxの範囲の整数乱数 
        ​
    (int)(min+((max-min+1)*(double)rand()/(double)RAND_MAX));​

        または、

    rand()%(max-min+1)+min
      

    《test032.c 》
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int main(void)
    {
    int a,b ,max,min;
    max=10;
    min=1;
    srand((unsigned int)time(NULL));
    for(a=0;a<10;a++)
        {
        b=(int)(min+((max-min+1)*(double)rand()/(double)RAND_MAX));
        printf("%10f ", (double)rand()/(double)RAND_MAX);
        printf("%3d ", b);
        printf("%3d \n", rand()%(max-min+1)+min);
        }
    }

        結果
       
          1 (mim) から 10 (max) の範囲内で乱数の整数を発生させます。

    

まとめ

 
 乱数は計算で行われるため、無限にランダムな数が出現するわけではなく、繰り返しの値が出現します。

  

目次