
上記FMX HIVE 2023の動画のような割合でランダムにする方法
Probability Maskみたいな使い方以外にも、ランダムの比率をコントロールする場合に使える。
ちなみにそのまんまの機能がAttribute RandomizeのCustom Discreteで行える。

Scene File
probabilityMask_gd.hiplc - Google ドライブ
作り
それぞれの値をmask_⚪︎というアトリビュートで0-1でペイントする。
ペイントした値を全てAttribute CopyやRayで転送する。必要であればPromoteする。
Attribute Adjust Dictionaryで辞書型アトリビュートとして転送したmask_⚪︎を書き込む。
そうするとKey, Valueのペアで配列のように書き込まれる。

これを元にsample_discreteを使用してペイントした値をWeightとしつつ、辞書からKeyを取り出す。
※今回はKeyの値を直接文字列で取り出しているが、実際に使うのはIndex値のままの方が使いやすいはず。
以下WrangleでWeightの比率を考慮したランダム値からKeyを抽出する。
※Preview用のアトリビュートも削除せず残しています。そのため記述には無駄が多いです。
float weightArray[];
i@num_dict = len(d@parms);
s[]@dict_key= keys(d@parms);
//delete 0
for(int i=0; i<@num_dict; i++){
float check = float(d@parms[@dict_key[i]]);
if(check == 0) {
removeindex(d@parms, @dict_key[i]);
}
}
//reset dict count
i@num_dict = len(d@parms);
s[]@dict_key= keys(d@parms);
//overwrite weight value
for(int i=0; i<@num_dict; i++){
float key_value = float(d@parms[@dict_key[i]]);
d@parms[@dict_key[i]] = key_value;
push(weightArray, key_value);
}
//weight value normalize
weightarraynormalize(weightArray);
f[]@array = weightArray;
//write value
i@index = sample_discrete(weightArray, rand(@primnum));
s@prim_color = @dict_key[@index];
//delete 0
この部分で後々のFor部分で無駄な負荷をかけないように値がそもそも0のものを念の為削除している。
//reset dict count
削除した結果を再度並べ直す。
//overwrite weight value
indexでForを回し、辞書からペイントした値を読み込み、それをweightArrayという別のWeightのみの配列に入れる。
//weight value normalize
比率がわかりやすくなるようにWeightの値をNormalizeする。
//write value
sample_discrete()を使用して、weightArrayの配列からWeightを考慮したIndex値を取り出す。
そのIndex値を元に再度辞書からKeyを取り出す。