ウェイトに基づいて乱数を生成

5382 ワード

もし1つの抽選が次のような情報であれば
int w_list[5] = { 20, 10, 40, 15, 15 };
string names[5] = { "   ", "  ", "   ", "pier ", "  " };

重み付け炊飯器-->20,歯ブラシ-->10に対応して,糞フォークに当たる確率が最大であることが分かった.
C++で実現
まず乱数1を得る.乱数発生器の初期化
使用法:void srand(unsigned int seed)
所在ヘッダファイル:stdlib.h
srand()はrand()が乱数を生成するときの乱数シードを設定するために使用されます.パラメータseedは整数でなければなりません.seedのたびに同じ値を設定すると、rand()によって生成されるランダムな数値は毎回同じになります.
  • 0-重み和内の乱数を得る
  • int w_sum = 0;
    
        int length = sizeof(w_list) / sizeof(int);
        for (int i = 0; i < length; i++)
        {
            w_sum += w_list[i];
        }
        /*for (int i = 0; i < length; i++)
        {
            cout << "rand()-" << i << "-" << rand() % w_sum << endl;
        }*/
        int randVal = rand() % w_sum;

    奨励するint rward代表奨励の下付き
        int rward = 0;
        for (int i = 0; i < length; i++)
        {
            if (randVal <= w_list[i])
            {
                rward = i;
                break;
            }
            randVal -= w_list[i];
            //printf("randVal = %d rward = %d 
    ", randVal, rward);
    } //printf("length = %d w_sum = %d randVal = %d rward = %d
    ", length, w_sum, randVal, rward);
    printf(" %s", names[rward].c_str());

    説明する
    まず各奨励の重みを設定します.ここでの重みの和は100でなければなりません.私のこのコードで設定した重みの和ビット100は、読者が各奨励抽選の確率を理解しやすいように設定されています.そのため、理論的には、数値が大きく、発生した随機数が大きく、ランダムになります.ここでは重みを配列に拡大するだけであり、一般的には、関連する配表の提供を計画し、配表から数値を読み出す必要がある.これにより、アプリケーションでは、新しい配表と事実上重み情報を更新することができる.配表により重みが設定されているため、奨励種別が不確定であるため、sizeof関数により数の占める空間を取得し、intが占めるメモリ空間を除いて配列長を取得する.次に、ウェイトの合計を求め、自分で作成したランダム関数を呼び出し、乱数を生成します.次は、この乱数がその奨励の重みの範囲にあると判断します.取得した乱送randValと重み配列の数を比較し、まずa[0]と比較し、取得した乱数を41,a[0]=5,41>a[0]と加えると、41-5を36に等しくし、2番目の数a[1]すなわち10と比較し続け、36を10より大きくし、10を減算して26になり、その後a[2]すなわち15と比較するか、それとも大きくするか、15を減算して16になる.そしてa[3]つまり25と比較すると、このとき、25より小さい、つまり、このときランダムにこの奨励金に着いた
    完全なコード
    #include 
    #include 
    using namespace std;
    
    int main()
    {
        srand((unsigned)time(NULL));
        int w_list[5] = { 20, 10, 40, 15, 15 };
        string names[5] = { "   ", "  ", "   ", "pier ", "  " };
        int w_sum = 0;
    
        int length = sizeof(w_list) / sizeof(int);
        for (int i = 0; i < length; i++)
        {
            w_sum += w_list[i];
        }
    
        int randVal = rand() % w_sum;
        int rward = 0;
        for (int i = 0; i < length; i++)
        {
            if (randVal <= w_list[i])
            {
                rward = i;
                break;
            }
            randVal -= w_list[i];
    
        }
        printf("      %s", names[rward].c_str());
    
        getchar();
        return 0;
    }