ウェイトに基づいて乱数を生成
5382 ワード
もし1つの抽選が次のような情報であれば
重み付け炊飯器-->20,歯ブラシ-->10に対応して,糞フォークに当たる確率が最大であることが分かった.
C++で実現
まず乱数1を得る.乱数発生器の初期化
使用法:void srand(unsigned int seed)
所在ヘッダファイル:stdlib.h
srand()はrand()が乱数を生成するときの乱数シードを設定するために使用されます.パラメータseedは整数でなければなりません.seedのたびに同じ値を設定すると、rand()によって生成されるランダムな数値は毎回同じになります.0-重み和内の乱数を得る
奨励する
説明する
まず各奨励の重みを設定します.ここでの重みの和は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より小さい、つまり、このときランダムにこの奨励金に着いた
完全なコード
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()によって生成されるランダムな数値は毎回同じになります.
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;
}