VCにおけるランダム関数

1967 ワード

C言語のランダム関数randomはよく知られていますが、random関数はANSI C標準ではないので、random関数はgcc、vcなどのコンパイラの下でコンパイルできません.では、どのようにしてVC言語のランダム関数を実現しますか?
実はrandom関数のほかにrand関数もあります.この関数もランダム関数で、彼は0からrand_まで生成することができます.max(32767)の乱数.
#i nclude #i nclude
int main() {    int k;    k = rand();    printf("%d\", k);    return 0; }//main
以上のコードをコンパイルして実行すると、確かに乱数が発生していることがわかりますが、プログラムを実行するたびに発生する乱数は同じですが、プログラムにforループを加えると、毎回発生する数は違いますが、このプログラムを実行すると、発生するデータは同じです.
では、実行するたびに発生する乱数が異なるようにプログラムを書くにはどうすればいいのでしょうか.次の例を見てください.
#i nclude #i nclude #i nclude #i nclude using namespace std; int main(void) {    int i;    time_t t;    srand((unsigned) time(&t));   cout<<"Ten random numbers from 0 to 99";    for(i=0; i<10; i++)        printf("%d", rand() % 100);    return 0; } このときプログラムを実行すると、発生するたびに乱数が異なることがわかります.
では、なぜ最初のプログラムが同じで、2番目のプログラムが同じなのでしょうか.
2番目のプログラムは新しい関数srandを用いた.
この関数は乱数にランダムシード(seed)を生成し、関数の原型はsrand(unsigned)time(NULL))である.
timeの値は毎時毎刻異なる.だから種子が違うので、発生する乱数も違います.
したがって,異なる乱数を生成するにはrandを使用する前にsrandを呼び出す必要がある.
srandとrand関数はstdlibに含まれる.hのヘッダファイルにあります.
randによる乱数は0からrand_までmaxの、rand_max(32767)は大きな数ですが、X~Yからの数はどのように生成されますか?
XからYまで、Y-X+1個の数があるので、XからYまでの数を作るには、このように書くだけです.
k = rand() % (Y - X + 1) +X;
これにより、任意の範囲の乱数を生成することができます.自分で書いたランダム関数:void randEx(int MAX,int NUM)
{
  int k=0;
  int j=0;
  time_t t;
  // rand , 。
  srand((unsigned) time(&t));
  for (k=1;k<=NUM;k++)// 。
  {
    RAND[k]=rand()%MAX;// 0 。
    do 
    {
    for (j=1;j<k;j++) if (RAND[j]==RAND[k]) //
              // , 。
    {
      RAND[k]=rand()%MAX;
      break;
    }
    }while(j<k);
  }
}