プレイ日記
おちゃめ ochame_nako
分布を自由にコントロールできる乱数を発生させる自作関数ADAMです。 ネームバトル系のゲーム、RPGのパラメータ生成など様々な用途に使用できます。 プログラムリストや解説等はコメントに書いています。
26そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
これがプログラムリストです。 20000回発生させた場合の分布表示を行うサンプルプログラムを付けています。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
使い方はADAM(S,P,Q)のように指定するだけで0~1の範囲の実数型の乱数を発生させます。自作ゲームで使用する場合には何倍かして整数化して使用すると良いでしょう。 Sは乱数の初期値(シード)です。0~1の範囲(1未満の値)で設定します。 0を指定した場合には毎回異なる値を返しますが、0以外を指定した場合にはシード値によって決まった値を返すのでネームバトル系のゲームに使用できます。 Pは端の値(大きい値、小さい値)の出やすさ(出にくさ)を設定可能です。2以上の値を設定してください。大きい値を設定するほど端の値が出にくくなります。(3~10くらいの範囲を推奨) Qは一様の分布をする範囲(平らに近い部分の範囲)を設定できます。(0.4~0.8くらいの範囲を推奨)
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
標準のRND関数(RNDF関数)ではなくこのADAMを使用することにどんなメリットがあるのかを書いていきます。 プチコンには標準でRND関数があります。この関数は計算式によって生成された擬似乱数であり、完全な乱数ではないとはいえRND(6)であれば0~5の6つの数字がどれも同じような確率で発生可能です。 RNDF関数であれば0~1の範囲で一様の分布の乱数を発生させることが可能です。(下図参照)
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
普通に使うならば特に問題はないですが、中央に近い0.5~0.6の範囲であっても0.9~1という高い値であってもほぼ同じ確率で発生するため「大きな値に対する希少性」は全くありません。 大きな値(小さい値)を出にくくするにはどうするかというと(RNDF()+RNDF())/2のように2つの乱数を足して2で割れば良いです。 そうすれば長方形だった分布がこんな感じで三角形に変わります。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
これで問題なければそれで終わりですが、これよりも大きな値の希少性をもっと高めたいとか希少性を自分でコントロールしたいという場合にはどうするかというともっとたくさん足して平均値を求めれば良いのです。 足す回数が多くなるほど中心極限定理によって正規分布に近いものになります。 例えば7回足して7で割ったものはこのような形になります。
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
ただし、希少性を高めれば高めるほど中央付近の値が出やすくなるという問題があります。 RPG等のパラメータ生成だと複数のパラメータを生成しても平均に近いパラメータばかりが生成されてしまい個性的なキャラが出来上がることはほとんどありません。 希少性とバラ付きを別々に考えることができないため「単純に複数回足して割る」という乱数は使いにくいと感じました。 ということでできたのがこのADAMです。
1そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
実はこれは昔ポケコンで作ったものをプチコン3号に移植したものです。 ADAMの特色は引数を変えることで分布を自由に変えることができるという点です。 Qの値を大きめに設定すれば一様分布の範囲をこんな感じに広くすることも可能です。
0そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
ネームバトル系のゲームを作るならば文字列のキャラコードを足して割るなどをして0~1の値(0より大きい値)をSの値に設定すればそれが固定値になるしブラックボックスの擬似乱数であるためプログラムリストを見て最強キャラを見つけ出すというということはできないというメリットがあります。(自分でパラメータを生成するプログラムを作っていたらリストを解析すれば最強キャラがばれてしまう) 要するにプチコンで用意されているRND関数(RNDF関数)をそのままで使うのではなく何らかの加工をすることで便利で面白い乱数を作ることが可能になるということです。 自作プログラムでADAMをそのまま使っても良いですが、「自分好みの乱数を作る」というのも楽しいですよ。
1そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
ちなみに上記記載のサンプルプログラムにおいてP=1:Q=0となっていますが、これは一様分布の状態となっています。 ADAMの明確な効果を確かめるにはP、Qの値を推奨範囲に変更しておいてください。
0そうだね
プレイ済み
返信[10]
親投稿
お、これは・・・。 乱数に関しては、まだ勉強してなく、 こういうのをいずれちゃんと知っておこうと思っていました。 ステキなDEFをありがとう御座います。 参考にさせて頂きます
0そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
るかかさんへ 乱数を自在にコントロールできるとゲーム作りに非常に大きな武器になります。ゲームにおいて乱数というのはほぼ欠かせない存在ですからね。 ちなみにこのADAMは実は1年半前にMiiverse上ですでに発表していますが、1箇所バグがあったのと当時の投稿は説明不足の部分があったので今回再投稿となっています。 前回と比べて反響がかなり大きくなっているのはMiiverseにおいてトピックスの最初のコメントや画像がすごく重要だからでしょうね。 どれだけ良いものを作っても最初の段階で「それはどんなものなのか?(どういうメリットがあるのか?)」が分からないと良さを理解してもらいにくいためだと思います。
1そうだね
プレイ済み
返信[12]
親投稿
あ、このやり方なら、初心者の私でも扱えるかも、やっぱりゲームをおもしろくするなら、ランダムの積み重ねなんですかね…。 あと、おちゃめさんのQSPのプログラム、ダウンロードさせていただきました。いろいろと使えて、おもしろいです。自分、絵は下手ですけどw
0そうだね
プレイ済み
返信[13]
親投稿
おちゃめ ochame_nako
ドラくんさんへ もしもゲームに乱数(乱数的なものも含む)が無かったら例えばRPGだったら敵の攻撃は常に同じでダメージ量も同じであるため戦闘が始まった時点で何巡目でどちらがHPいくら残して勝つということが分かってしまいます。 トランプゲーム等においては乱数が無かったら配られるカードが常に同じになるためゲームとして成立さえしません。 アクションゲームやシューティングゲームは毎回動きが異なると攻略しにくいため意図的に特定パターンになるようにしていますが、ユーザーが考えるタイプのゲーム(というか反射神経やボタン操作が要求されるされるようなゲーム以外)で乱数が無かったら非常につまらないものになります。 しかし、乱数をどのように使うかで面白さが変わるため乱数を使いこなせるようになることが面白いゲームを作るには欠かせないと思います。
0そうだね
プレイ済み
返信[14]
親投稿
おちゃめ ochame_nako
あと私のQSPを使っていただきありがとうございます。QSPということで機能が少ない分だけ多も覚えることが少なくて使いやすいと思います。消しゴムを瞬時に選べるだけではなく瞬時にペンや消しゴムの太さを変えることができラクガキを描くのに最適です。 SIMPLE PAINT QSP https://miiverse.nintendo.net/posts/AYMHAAACAAADVHkuvFo95w クリスマス絵 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHkuvAODgQ お正月絵 https://miiverse.nintendo.net/replies/AYMHAAACAAADVHkygISKcQ リクエスト絵 https://miiverse.nintendo.net/replies/AYMHAAACAAADVHky5jjQhg
0そうだね
プレイ済み