Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

重み付きランダムの実装

こんにちは、かささぎです。HUAWEI P10 liteはいいぞ。

今回はJavaで重み付きランダムを実装したので、メモっときます。

ソシャゲによくあるガチャの実装など、汎用性は高そうです。

軽く調べた程度では、これが正解、みたいなアルゴリズムはでてきませんでした。 

 

今回はIDEを使わず、SublimeText3とコマンドプロンプトで実装しました。

IDEは多機能でよいのですが、コード補完がしっかりしてるIDEばっかり使ってると文法などを忘れてしまいそうなので、今回は思い出しも兼ね使いませんでした。

<プログラムコード>

gistbe560d71d6c4e643229f492ca14a7acf

 解説します。

Factorクラスには、事象の名前とそれが発生する確率を入れます。確率は整数値で、他との相対的な比率を取るようにしました。今気づいたけど、これわざわざクラスじゃなくてHashMapでいいな...

今回は某ソシャゲ、き〇〇ファ〇タ〇アのガチャの比率にしました。ソシャゲの表示が正確なら、シミュレータとして利用できそうです。

getRandom関数で変数を作成し、Factorクラスで定めた比率になるように演算して、対応した値を返しています。

これをコマンドラインで実行すると、

f:id:yh9092:20171216201402p:plain

★がMS932では利用できないみたいですね。MS932はクsコマンドラインで実行するとこういうことに気付けて勉強になります。UTF-8エンコードして実行します。

f:id:yh9092:20171216201607p:plain

<実行結果>

f:id:yh9092:20171216201832p:plain

★3...まあ、そうなるな。

 

これを利用し、複数回実行して集計を取る際は以下のようなコードで実装できます。

giste71ef4689f473b95b869eb444961b241

trailsには試行回数を入れます。

resultというArrayList<Integer>型を作り、getRandom()関数で得た数値番目の値をインクリメントしていきます。

factおよびresultは、プログラム内でサイズを変更する機会がなかなかないと思うので、通常配列でもいいかもしれません。

<実行結果>

f:id:yh9092:20171216202351p:plain

いい感じですね。

 

今回はこれくらいです。この後に、〇らら〇○ン〇ジ〇の10連も実装したのですが、なかなかコードが長く複雑になったので、機会があったらブログにWriteUPしたいと思います。

 

それでは。