ここから本文です

ランダムかつ、確立設定のシンプルな方法。ロジック。 以下のようなかんじで...

eos********さん

2019/3/1712:35:45

ランダムかつ、確立設定のシンプルな方法。ロジック。


以下のようなかんじで複数の配列があります。

[4,2,1,3,5]
[7,8,9,10,11]
・・・・

例えば、1個目の配列で言えば、1が一番出やすく、続いて2と3は同率で出やすく、4と5はその次に同率で出やすくなるように設定したいです。

例えば、一個目の配列で、1の出現率は70%、2と3は50%などのように、それぞれの出現率も調整したいのですが、こねくり回せば何とかなるとは思いますけど、とりあえずシンプルな実装方法だとどう書けばいいんですかね。

それぞれの配列自体はか要素はそんなに多くはならないので、並び替えとかはあんまり考えなくて良いんですけど、確立の数字付きのキー配列を全部作るとかなんですよね、多分。。

閲覧数:
23
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

shi********さん

2019/3/1714:53:58

♯出先から(スマホ)なので簡潔に・・

>確立の数字付きのキー配列を全部作るとかなんですよね、多分。。

そこまでわかっていれば、あとは書くだけだと思います。

・空の配列を用意する

・元の配列の各々の要素について、その値の要素を確率の分だけ用意した配列に追加する。

・追加が終わったらシャッフルして、先頭からひとつ取り出す。

でいいと思います。

確率の分だけ追加するときにarray_fillで作成して追加するとか細かい書き方はあるでしょうけど、基本的な考え方は上記のとおりで宜しいかと。

  • shi********さん

    2019/3/1808:02:57

    たとえば、値と確率を以下のように設定したとします

    $arr = [1=>50, 2=>20, 3=>20, 4=>5, 5=>5];

    次のようにして確率を乗算して配列を生成します

    $tmp = [];
    foreach ($arr as $val=>$qty) {
    $tmp = array_merge($tmp, array_fill(0, $qty, $val));
    }

    (値が整数値なので(文字列ではないので)array_mergeで大丈夫)

    あとは

    $ret = $tmp[rand(0, count($tmp)-1)];

    のようにして取り出せばいいと思います。

    上記の例だと、10000回くらいで試行すれば

    1 : 4923
    2 : 2043
    3 : 2009
    4 : 507
    5 : 518

    くらいにはまとまると思います(今やってみた例です。試行のたびに回数は変動します)。

  • その他の返信(2件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/3/21 21:19:07

なかなか時間が取れなくて、ようやく内容を解釈いたしました。

やはり素晴らしいルーチンだと思いました。

確実に自分だったらもっと色々とこねくり回して、恥ずかしいロジックで何とかしていたと思います。

聞いてみて良かったです。

本当にありがとうございました。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる