ゲームの中で確率的にある音響効果を再生する簡単なc++実現
6952 ワード
xactに詳しい人は、1つのcueが複数のsoundに対応できることを知っています.あるcueを再生するとxactはsound再生確率ごとにあるsoundを選択して次の再生を行う.
ここでrandを用いて,確率によってある項目を選択するシミュレーションを簡単に行った.
4つのsoundに対応する確率はそれぞれ:
A——%20
B——%40
C——%10
D——%30
100%確率を想定すると、上記の各項目に対応する確率を0-100と簡単に指定できます.
A————100内(0-19)20%対応
B————100内(20-59)40%対応
C————100内(60-69)10%対応
D————100内(70-99)30%対応
ここでrand()を用いて求めた確率は、上記と絶対的に20%のように正確ではないが、基本的には所定の確率に従って相応の選択を行うことができる.
次はテストコードです.
今日、実際に実装されたときにいくつかの小さな問題が発見されました.例えばrand()を使用するとき、一度だけ取得すれば、最初に実行された値は永遠に同じであるため、論理を修正する必要があります.また、確率で選択できる個数が固定されていない可能性があるので、これらは考慮する範囲です.
次は修正版のテストコードです.
効率的にはあまりよく感じませんが、基本的には各項目の重みで確率を計算し、確率に従ってある項目を選択します.
ここでrandを用いて,確率によってある項目を選択するシミュレーションを簡単に行った.
4つのsoundに対応する確率はそれぞれ:
A——%20
B——%40
C——%10
D——%30
100%確率を想定すると、上記の各項目に対応する確率を0-100と簡単に指定できます.
A————100内(0-19)20%対応
B————100内(20-59)40%対応
C————100内(60-69)10%対応
D————100内(70-99)30%対応
ここでrand()を用いて求めた確率は、上記と絶対的に20%のように正確ではないが、基本的には所定の確率に従って相応の選択を行うことができる.
次はテストコードです.
void main()
{
int ia(0),ib(0),ic(0),id(0);
for(int i = 0;i<100;i++)
{
int n = rand() % 100;
if(n<=19)
{
ia++;
cout << "A"<<endl;
}else if(n<=59)
{
ib++;
cout << "B"<<endl;
}else if(n<=69)
{
ic++;
cout << "C"<<endl;
}else
{
id++;
cout << "D"<<endl;
}
}
cout << "A=%"<<ia<<endl;
cout << "B=%"<<ib<<endl;
cout << "C=%"<<ic<<endl;
cout << "D=%"<<id<<endl;
system("pause");
}
今日、実際に実装されたときにいくつかの小さな問題が発見されました.例えばrand()を使用するとき、一度だけ取得すれば、最初に実行された値は永遠に同じであるため、論理を修正する必要があります.また、確率で選択できる個数が固定されていない可能性があるので、これらは考慮する範囲です.
次は修正版のテストコードです.
struct stSound
{
string Name;
int weight;
}
string GetSelectName(vector<stSound> *vecSound)
{
int sum = 0;
int ia = 0;
vector<int> vecTemp;
for(int i =0;i<vecSound.size();i++)
{
sum += vecSound.at(i).weight;
}
for(int i =0;i<vecSound.size();i++)
{
ia += ((vecSound.at(i).weight)*100) / sum;
int nRange = ia;
vecTemp.push_back(nRange);
}
srand((unsigned int)time(0));// rand()
int iVlau = rand()%100;
for(int i = 0;i<vecTemp.size();i++)
{
//
if(iVlau == vecTemp.at(i))
{
return vecSound.at(i).Name;
}
}
return NULL;
}
効率的にはあまりよく感じませんが、基本的には各項目の重みで確率を計算し、確率に従ってある項目を選択します.