投稿
たまご tamagopu
【乱数調整の工夫】5分の1の確率で寝て、5分の4の確率で上下左右に動く猫さんを作ったらすごくよく寝る子になっちゃいました(笑)これはこれでかわいいけど今ちょこちょこ乱数弄っているところです。 皆さんは乱数の調整ではどんな工夫をしますか? 私の場合、単純に乱数20個出して1つだけ寝る動作に割り当てたり(ちょっと面倒?)、たくさん乱数を使うときは(分布)関数を決めておいてそれを計算して関数>乱数なら採用、違ったら乱数取り直しという方法を使ったり(判断や棄却する動作がもったいないかな?)しますが、もっと面白い方法があったら知りたいです(´`**)
3そうだね
プレイ済み
返信[1]
親投稿
たまご tamagopu
うーん、文章わかりにくくてすみません。
0そうだね
プレイ済み
返信[2]
親投稿
てっく tekpro
要は適当にRNDを使うだけでは乱数の偏りが出るということですか? 某KOTYで出目の偏るサイコロやルーレットが取り沙汰されたことがありますが、そこでカイ2乗検定なんて方法を目にしたことがあります(よく分かってないけど)
0そうだね
プレイ済み
返信[3]
親投稿
たまご tamagopu
てっくさん コメントありがとうです。分かりにくくてすみません。 んーと、むしろ逆かなあ。 まだRNDにどれくらい偏りがあるかは確かめてないですが、それがきちんとした確率で出ていると仮定して、特定の動作を多めに出すために出てくる乱数の割合を調整することってあると思うのですが、それで知らない工夫があったらやってみたいなあって。例えばガチャぽんゲームを作るとして、大当たりが他のと同じ割合で出てしまったら面白くないですよね? もちろん、綺麗な乱数を出すためにあれこれ工夫するのも楽しいのですが(´`*) χ二乗は出てきたものが偏ってないかを確かめる方法ですね。
0そうだね
プレイ済み
返信[4]
親投稿
てっく tekpro
なるほど〜。 いかんせん乱数はマニュアル通りの方法でしか使ったことがないので、もうちょっと勉強したいですね
0そうだね
プレイ済み
返信[5]
親投稿
もやしもどき Pseudomoyashi
あまりこったことはしたことが(というか考えたこと自体が)ないですが、正規分布っぽい分布の乱数を得るために何個か乱数をとってその合計値なり平均値なりを使う、とかですかね。
0そうだね
プレイ済み
返信[6]
親投稿
TINY TINY-YAROU
ゲームで乱数を使うのって難しいですよね。 例えば、「確率10%で当たり」という場合。10回サイコロを振ったら1回くらいは当たりが出る、というのが理想ですが、実はそうはならないのです。 「大勢の人がサイコロを振って、当たらなかった人だけが次のサイコロを振る」と考えてみましょう。 1回振って当たらない人は、最初の人数×0.9 2回振って当たらない人は、「最初の人数×0.9」×0.9 3回振って当たらない人は、「「最初の人数×0.9」×0.9」×0.9 そう考えていくと、10回振っても当たらない人は、0.9^10=0.348。 つまり、約35%の人は、確率10%のサイコロを10回振っても一度も当たらないんです。
2そうだね
プレイ済み
返信[7]
親投稿
TINY TINY-YAROU
そういうわけなので、いい感じにするのであれば、例えば、1個の当たりと9個のハズレを用意して、1回サイコロを振るごとに、出た目の箱を消していくとか。 DIM A[10]:'はこを10こ A[0]=1:'あたり A[1]=0:A[2]=0:A[3]=0:A[4]=0:A[5]=0:A[6]=0:A[7]=0:A[8]=0:A[9]=0 FOR I=1 TO 10 R=RND(10-I+1):'のこりのはこからえらぶ ?I;"かいめ "; IF A[R]==1 THEN ?"あたり!" ELSE ?"ハズレ!" FOR J=R+1 TO 10-I A[J-1]=A[J]:'はこをへらしていく NEXT NEXT
1そうだね
プレイ済み
返信[8]
親投稿
さとし SatoshiMcCloud
質問の意図を汲んで、たとえば5分の1の確率でネコちゃんが寝るとします。で、それを5回試すとします。 このとき、試した5回のうちピッタリ1回だけ寝る確率は40%ほどしかありません。残り60%のうち33%は1回も寝ない、27%は2回以上寝てるということになります。 例えば、 1. a[5]を定義し、a[n]=nを代入 2. 何かしらのアルゴリズムで配列の中身をシャッフル 3. 5回まで試行し、x回目試行時に、a[x-1]=0ならねる とすれば、直感とほぼ一致する結果を出せると思います。イメージとしては、サイコロを振るのではなくトランプを引きまくる(最後まで引き続ければ必ずジョーカーが出るという理屈)ような感じです。多少インチキですが、ゲームには必要なインチキだと私は思います。
0そうだね
プレイ済み
返信[9]
親投稿
のざらし longyearsago
重み付けですかね。 R=RNDF() IF (R < 0.01) THEN 寝る IF (0.01 <= R) THEN 動く 的な。
0そうだね
プレイ済み