C++におけるランダム関数のRandowm関数の使用方法

2256 ワード

C++におけるランダム関数のRandowm関数の使用方法
一、ランドム関数はANSI C規格ではなく、gcc、vcなどのコンパイラでコンパイルできません。C++下のランド関数に変えて実現できます。
     1、C++標準関数ライブラリは乱数生成器randを提供し、0-RAND_を返します。MAX間で均一に分布する擬似乱数の整数。RANDMAXは少なくとも32767でなければなりません。rand()関数はパラメータを受け付けません。デフォルトでは1をシード(開始値)とします。乱数生成器は常に同じシードで開始されるので、形成された疑似乱数列も同じであり、ランダムな意味を失ってしまう(でも、このようにプログラムの調整がしやすいです。 
     2、C++のもう一つの関数srand()は、異なる数(符号無し整数変数)をシードとして指定できます。しかし、シードが同じなら、疑似乱数列も同じです。1つの方法は、ユーザにフィードを入力させることですが、まだ理想的ではありません。 
     3、理想的なのは変化の数、例えば時間を乱数生成器の種とすることです。タイムの値は刻々と違っています。したがって,シードが異なるので,発生する乱数も異なる。

// C++    (VC program) 
#include <stdlib.h> 
#include <iostream.h> 
#include <time.h> 
#define MAX 100 
void main()
{ 
    srand( (unsigned)time( NULL ) );//srand()                   
   for (int i=0;i<10;i++) 
   cout<<rand()%MAX<<endl;//MAX    ,     0~MAX-1
} 
二、ランドの使い方   
    rand()はパラメータを必要とせず、0から最大乱数までの任意の整数を返します。最大乱数の大きさは通常固定された大きな整数です。このように、0から10までの10個の整数を生成すると、次のように表現できます。

  int N = rand() % 11; 
     このようにNの値は0~10の乱数であり、1~10を生成すると、次のようになる。

  int N = 1 + rand() % 10; 
まとめて言えば、次のように表すことができます。

 a + rand() % n 

     aは開始値であり、nは整数の範囲である。0~1の小数を求めるなら、まず0~10の整数を取って、10で割ると10桁のランダム小数が得られます。ランダムで100パーセントのランダム小数を得るには、まず0~100の10個の整数を得て、それから全部で100を割ります。
このようなプッシュ。 
     通常のランド()で発生する乱数は、運行のたびに前回と同じであり、意図的にこのように設計されており、プログラムの調整を容易にするためである。毎回異なる乱数を生成するには、スラッド関数を使ってランダム化し、seedによって異なる乱数を生成することができます。 
     皆さんが言っているように、time.hヘッダファイルを含んで、srand(time(0)を使って、現在の時間を使って、乱数発生器をランダム化してもいいです。これにより、2回の運転ごとに異なる乱数シーケンスが得られます。
注:ランド()は0トRAND_が発生します。MAX(32767)上の乱数は、32767は11で割り切れません。
したがって、int N=rand()%11;得られた乱数は、0から10まで一貫して分布したものではなく、10の確率で0から8個の数字を取る確率は11/32767以下で、約1/2978です。
だから0~Mの乱数を取ります。Mが小さいと問題は大きくないですが、Mが大きい場合、例えばM=30000なら、0-2767まで取る確率は後の数の倍を取るので、ランダム分布にはひどく合いません。
三、要求に応じて確率を設定する
 例えば、10%の確率問題を設定するなら、私達はrand()関数を使って実現できます。if条件文の判断では、rand()で得られた値%を一つの設定の値に設定し、もう一つの値を「=」と演算します。
たとえば:

if(1==rand()%10)
{ //10%     ,        }
else
{ //90%      ,        }
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。