C言語rand関数の段階的な検討と実現

1486 ワード

C言語におけるランダム関数の適用
C言語のランダム関数randomはよく知られているかもしれませんが、random関数はANSI C規格ではないので、random関数はgcc、vcなどのコンパイラの下でコンパイルすることはできません.では、どのようにしてC言語のランダム関数を実現しますか?     
random関数のほかにrand関数もあり、ランダム関数でもあり、0からrand_まで生成できます.maxの乱数.
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x;
    x = rand();
    printf("%d
", x); return 0; }

上のコードを実行すると、システムは確かにランダム数を生成していることがわかりますが、何度も実行し続けると、システムが生成した数字が以前のものなのか、どんな状況なのか、私の感情を傷つけます~~
元々は乱数取はC言語では固定シーケンスを採用しているため,実行ごとに同じ数をとる.
しかし、よく考えてみると、いろいろな乱数を生成するには、どうすればいいのか、ひざまずいて蒼天を求めましょうああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    int x;
    time_t t;
    srand((unsigned) time(&t));
    for(int i=0; i<10; i++) {
        printf("%d
", rand()%100); // 10 0~99 } return 0; }

このときプログラムを実行すると、発生するたびに乱数が異なることがわかります.
では、なぜ最初のプログラムが同じで、2番目のプログラムが異なるのでしょうか.
2番目のプログラムは新しい関数srandを用い,この関数は乱数にランダムシード(seed)を生成し,関数プロトタイプは
srand( (unsigned) time(NULL));     
timeの値は毎時毎刻異なる.だから種子が違うので、発生する乱数も違います.
したがって,異なる乱数を生成するにはrandを使用する前にsrandを呼び出す必要がある.
randによる乱数は0からrand_までmax,rand_maxは大きな数ですが、X~Yからの数はどのように生成されますか?
XからYまで、Y-X+1個の数があるので、XからYまでの数を作るには、このように書くだけです.
k=rand()%(Y-X+1)+X;  
これにより、任意の範囲の乱数を生成することができます.