私はA、B、C、D、E、Fという6つの項目を持つプログラムを書いています。別の配列は、各項目のそれぞれの確率を格納します。与えられた確率に基づいて文字を選択するプログラムの論理エラー
私の仕事は、確率に従ってアイテムを選択する関数を書くことです。すなわち、アイテムAが20%の確率を有する場合、5000回の実行において、時間Aの20%が返されるべきである。
私はこれを行うプログラムを書いていますが、結果の確率が必要な確率と異なるため、論理的な誤りがあるようです。
アルゴリズムに問題がある場合や改善する方法がある場合は、誰かに教えてもらえますか?
#include <iostream>
#include <array>
#include <stdlib.h>
#include <time.h>
int Probability(std::array<int,6> Probabilities)
{
//To calculate probability:
//Create a new array of size Probabilites.
std::array<int,Probabilities.size()> Limits;
//At each index of the array store total of all previous probabilites
Limits[0] = 0;
for(int i=1; i<Limits.size();i++)
{
Limits[i] = (Limits[i-1] + Probabilities[i]);
}
//Get a random number.
int RandomNumber = rand()%100 + 1;
//std::cout<<"Random: "<<RandomNumber<<"\n";
//find between which indexes the random number lies and return the lower one.
for(int i=0;i<Limits.size();i++)
{
if(RandomNumber >= Limits[i] && RandomNumber< Limits[i+1])
{
//std::cout<<RandomNumber<<" is between "<<Limits[i]<<"(index="<<i<<") and "<<Limits[i+1]<<"(index="<<i+1<<"). Returning "<<i<<".\n";
return i;
}else continue;
}
}
int main()
{
const int SPINS = 5000;
std::array<char,6> Characters = {'A','B','C','D','E','F'};
std::array<int,6> Probabilities = {10,5,2,38,25,20};
std::array<int,6> Frequencies = {0,0,0,0,0,0};
std::srand(time(NULL));
for(int i=0;i<SPINS;i++)
{
Frequencies[Probability(Probabilities)]++;
}
int TotalPercentage=0;
for(int i=0;i<Frequencies.size();i++)
{
float Percentage = (Frequencies[i]*100)/5000;
TotalPercentage+=Percentage;
std::cout<<Characters[i]<<"\t"<<Percentage <<"\t"<<Probabilities[i]<<"\n";
}
std::cout<<"Total"<<"\t"<<TotalPercentage<<"\t"<<100<<"\n";
}
結果
アイテム度Prob度Prob(REQ)
B 1 5
C 37 2
D 24 3 8
E 20 25
F 0 20
合計97 100
これは[CodeReview.SE](http://codereview.stackexchange.com/)に属します。 – ildjarn
Rand()%100が間違っていると、低い値にバイアスが追加されます。そして、+1もおそらく望んでいないでしょう。 – wildplasser
あなたはC++ 11をはっきりと使用していますので、C++ 11で導入された非常に優れた乱数生成機能を使用してみませんか?また、なぜあなたは 'のために(...){if(...)else else; } 'else else'は何もしません。 –