時々使いそうな関数





random_select

要素数A、要素数B、要素数C・・・のものの中から、同様に確からしい確率で1つを取り出したとき、どの要素が取り出されたかを返す。
使い方はdata[0]に0を、data[1]〜にA〜の要素数を、最後のデータは番兵として負数を入れてこの関数を呼び出す。
要素数と書いたが、小数でもよい。例えば10%(0.1)、50%(0.5)、40%(0.4)の確率で起きることのどれが起きたかを判定する場合
data[0]=0;
data[1]=0.1;
data[2]=0.5;
data[3]=0.4;
data[4]=-1;
i=random_select(data);
とすると、iに10%の確率で1が、50%の確率で2が、40%の確率で3が入る。
(int)(data[i]*100) とあるように、この場合小数以下2桁が結果に反映される。

int random_select(double data[256])
{
int datanum;
int datasum[256];
datasum[0]=0;
for(int i=1;;i++)
{
datasum[i]=datasum[i-1]+(int)(data[i]*100);
if((data[i]<0)||(i>=254)){datanum=i-1;break;}
}
while(1)
{
int r=random((datasum[datanum]));
for(int i=1;i<=datanum;i++)if(r<datasum[i])return i;
}
}