以下の内容はhttps://godofsuama.hatenablog.com/entry/2025/08/04/100000より取得しました。


Tips - Probability Maskというかランダムの比率をコントロールする

www.youtube.com

上記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を取り出す。

sample_discrete

※今回は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を取り出す。




以上の内容はhttps://godofsuama.hatenablog.com/entry/2025/08/04/100000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14