C++乱数発生(整理)

2206 ワード

1,
C++ではrand()関数を用いて乱数を生成するのが一般的であるが,厳密には擬似乱数(pseudo-random integral number)のみが生成される.乱数を生成するには、プログラム内でループすると、次に乱数を生成するときに前回の結果をシードとして呼び出すシードを指定する必要があります.ただし、プログラムを2回に分けて実行すると、シードが同じであるため、生成される「乱数」も同じになります.
エンジニアリング応用では,システムの現在時間(Unix時間)をシードとして一般的に用い,生成された乱数は実際の意味での乱数に近い.
2,random関数はANSI C規格ではなく,gcc,vcなどのコンパイラでコンパイルできない.C++の下のrand関数を用いて実現することができる.1、C++標準関数ライブラリは乱数生成器randを提供し、0-RAND_を返すMAX間に均一に分布する擬似ランダム整数.RAND_MAXは少なくとも32767でなければなりません.rand()関数はパラメータを受け入れず、デフォルトは1をシード(すなわち開始値)とします.乱数生成器は常に同じシードで始まるので,形成された擬似乱数列も同様であり,ランダムな意味を失う.(ただし、これによりプログラムデバッグが容易になる)3、C++の別の関数srand()は、異なる数(符号なし整数変数)をシードとして指定できます.ただし、シードが同じであれば、擬似乱数列も同じです.1つの方法は、ユーザーにシードを入力させることですが、依然として理想的ではありません.4、乱数生成器のシードとして時間などの変化数を用いることが望ましい.timeの値は毎時毎刻異なる.だから種子が違うので、発生する乱数も違います.
5,rand()の使い方rand()はパラメータを必要とせず、0から最大乱数までの任意の整数を返します.最大乱数のサイズは通常、固定された大きな整数です.このように、0~10の10個の整数を生成する場合は、int N=rand()%11と表現することができる.このように、Nの値は0~10の乱数であり、1~10を生成するとint N=1+rand()%10となる.要約すると、a+rand()%nのうちのaは開始値であり、nは整数の範囲であると表すことができる.a+rand()%(b-a+1)は、a~b間の1つの乱数が0~1の小数であれば、0~10の整数を先に取得し、その後、10をすべて除算して10個の乱数から10個の乱数を得ることができ、ランダムから100%の乱数を得るには、まず0~100の10個の整数を得て、それからすべて100を除算する必要があり、その他の場合はこのように推定する.通常rand()で生成される乱数は、プログラムのデバッグを容易にするために設計されたものであり、実行するたびに前回と同じである.毎回異なる乱数を生成するにはsrand(seed)関数を用いてランダム化し,seedによって異なる乱数を生成することができる.皆さんがおっしゃるようにtimeも含めてもいいです.hヘッダファイルは、srand(time(0))を使用して現在の時間を使用して乱数発生器をランダム化し、2回の運転ごとに異なる乱数シーケンス(2回の運転間隔が1秒を超える限り)が得られることを保証します.
コード:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
double random(int start,int end)
{
    return rand()%(end-start);
}
int main()
{
    srand(unsigned(time(0)));
    for(int i = 0; i != 10; ++i)
        cout << "No." << i+1 << ": " << int(random(0,10))<< endl;
	cout<<"max:"<<RAND_MAX;
    return 0;
}

結果:
1回目:
No.1: 6
No.2: 9
No.3: 8
No.4: 7
No.5: 1
No.6: 1
No.7: 4
No.8: 3
No.9: 0
No.10: 0
max:32767Press any key to continue

2回目:
No.1: 9
No.2: 2
No.3: 8
No.4: 6
No.5: 2
No.6: 7
No.7: 9
No.8: 8
No.9: 4
No.10: 8
max:32767Press any key to continue