- ベストアンサー
確率の判定方法が分かりません
確率の判定方法が分かりません 変数に0.5%を設定することで、1000回中5回に”当たった”を表示するプログラムを作りたい場合 どうすればいいでしょうか? イメージとして、下にあるような方法なんですが。 var rate:Number = 0.5; //百分率 var num:Number = 0.5 / 100; // 百分率を実数に戻す var kaisu:Number = 1000; var kai:Number = kaisu * num; if(1~1000のランダムの値 <= kai) { //当たった }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
他の方と同じような違うような...。 Math.random() で得られる乱数の数値は 0以上1未満の数(0 <= 数値 < 1)です。 乱数の数値は 0以上1未満の数 なのですから 例えば 100% の確率で「当たった」を出したい場合 →Math.random() で乱数を得て 乱数が 1 未満であれば「当たった」を出す 90% の確率で「当たった」を出したい場合 →Math.random() で乱数を得て 乱数が 0.9 未満であれば「当たった」を出す 80% の確率で「当たった」を出したい場合 →Math.random() で乱数を得て 乱数が 0.8 未満であれば「当たった」を出す … … 10% の確率で「当たった」を出したい場合 →Math.random() で乱数を得て 乱数が 0.1 未満であれば「当たった」を出す 0.5% の確率で「当たった」を出したい場合 →Math.random() で乱数を得て 乱数が 0.005 未満であれば「当たった」を出す 0% の確率で「当たった」を出したい場合 →Math.random() で乱数を得て 乱数が 0 未満であれば「当たった」を出す という考え方(そういうルール)で行けば良いと思います。 つまり X% の確率で「当たった」を出したい場合 →Math.random() で乱数を得て 乱数が X/100 未満であれば「当たった」を出す というルールにすれば良いのでは? ということです(↓図参照)。 例として 『戻り値として「当たった」または「外れた」という文字列を返す関数』 を作り それを使うと次のようになります。 ----------------------- //当たり外れを返す関数 answerHitOrBlank の定義 function answerHitOrBlank(num:Number):String { // //変数 rnd に 0以上1未満 の乱数を代入 var rnd:Number = Math.random(); // //乱数 rnd が引数 num の100分の1未満であれば if (rnd < num/100) { // 「当たった」という文字列を返す return "当たった"; //それ以外は } else { // 「外れた」という文字列を返す return "外れた"; } } var rate:Number = 0.5;//百分率 //変数 str に「当たった」or「外れた」の文字列を取得 var str:String = answerHitOrBlank(rate); //取得した文字列を出力 (→ムービープレビューで確認) trace(str); ----------------------- ↑たまたま ActionScript 2.0 でも 3.0 でも共通で使えます。 (これは "たまたま" です。) もし ActionScript 2.0 でしたら 最後の2行を次のように変更すれば検証しやすいかもしれません。 this.onEnterFrame = function():Void{ //変数 str に「当たった」or「外れた」の文字列を取得 var str:String = answerHitOrBlank(rate); //取得した文字列を出力 (→ムービープレビューで確認) trace(str); };
その他の回答 (4)
- gcqd75ce
- ベストアンサー率8% (6/67)
やぁ♪2回も回答できるのかなぁ。ぼくレオ先生^^; 魚群の話は面白かった? 確実に1000回の中に5個当たりを入れるには順次を入れ替える方法がポピュラーだよ。 千個の配列の中にランダムで5個の当たりを入れる。 配列の内容をシャッフルする(順次をいれかえる) こうゆうプログラムはゲーム界ではよく使われるよ。 例えば、マージャンの初期配置とか、トランプを配る初期状態とかさ。 難しいですか?
- DPE
- ベストアンサー率85% (666/776)
当たる確率が 0.5 %とは、クジと当たりの数が常に一定で当せん確率はいつも 0.5 %である場合と、1000 回に5回は必ず当たるけれど、当たる確率は初回のみ 0.5 %でクジを引くごとに当せん確率が変動するという場合の、2通りが考えられます。 前者は単純に、1~ 1000 の間で乱数を作り、できた乱数が1~5の間にあれば当たり、それ以外はハズレと考えると簡単です。 理論的には 1000 回に5回当たる確率ですが、実際には 1000 回引いても1回も当たらないかもしれないし、逆に運よく6回以上当たることもあるかもしれません。 こちらは、例えばゲームで魔物を倒した時にアイテムを落としていく確率が 0.5 %、というような場合の確率です。 後者は福引などのようなものです。 1000 回引くと5回は必ず当たるのですが、0.5 %という当せん確率は最初の1度限りです。既に当たりが5本出てしまった時は当せん確率は 0 %ですし、逆に、クジの残り5本が全て当たりならば当せん確率は 100 %となります。 こちらも常に 0.5 %の確率と同様に、乱数の範囲を利用して作ることができます。 福引と同じ確率の作り方は様々ですが、当たりとハズレの2つだけでしたら、クジの本数と当たりの本数をそれぞれ変数で管理してこの値をもとに乱数を作り、クジを引く・当たりが出るたびに数を減らしていってはいかがでしょう。 1~クジの本数の間で乱数を作り、できた乱数が1~当たりの本数の範囲内にあれば当たり、それ以外はハズレと考えます。 今回は作る乱数も当たりと判断する数の範囲も必ず1から始まりますので、つまり、できた乱数が当たりの本数より大きい(本数自体は含まない)場合はハズレ、それ以外は当たりとなります。 クジの部分の概略だけをスクリプトにしますと、大体、こんな感じでしょうか。 実際は、クジを引くボタンが押された時などに乱数を作り当せん判定を行う処理を書くことになるかと思います。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) /********************************/ //クジの本数と当せん確率(単位は%)を設定 var lot_max:Number = 1000; var prize_per:Number = 0.5; //当たりの本数を設定 var prize_max:Number = lot_max * prize_per / 100; //クジは残っているか? //残っている場合はクジを引く if( lot_max > 0 ) { //1~クジの本数の間で乱数を作る var rnd:Number = Math.floor( Math.random() * lot_max ) + 1; //当たりの本数より大きい場合はハズレ if( rnd > prize_max ) { /*ここにハズレの処理を書く*/ } //1~当たりの本数の範囲内であれば当たり else { /*ここに当たりの処理を書く*/ //当たりの本数を減らす prize_max--; } //クジの本数を減らす lot_max--; } //クジが残っていない場合は終了 else { /*ここにクジの終了処理を書く*/ } /********************************/ 上記の例は 1000 本の中に当たりが5本含まれるクジになります。 当たりが出るたびに当たりの本数を管理している変数 prize_max の値が減り、5回当たりが出ると 0 になります。 クジの乱数は 1 以上ですから、prize_max が 0 の時は if( rnd > prize_max ) の条件が成立して必ずハズレと判断されます。 また、クジの本数もクジを引くたびに減るので、クジは予め決められた本数(上記の例では 1000 回)しか引くことができません。 クジの本数が作る乱数の最大値であり、これはクジを引くたびに小さくなっていくため、当たりが終盤まで残っていればいずれは必ず当たりを引けます。 合わせますと、1000 回引くと必ず5回当たり、当たりはきっちり5回しか出ないことになります。
- H240S18B73
- ベストアンサー率65% (190/288)
1000回中5回確実に当たるようにするなら 1000個のプール値の配列を作って ランダムに5個trueを潜ませて 巡回するとかいう方法もあります 頭に戻ったらまた ランダムにtrueを潜ませた プール値配列を作り直すカンジですね
- gcqd75ce
- ベストアンサー率8% (6/67)
例えば、 海物語で魚群が流れるとしよう。 7回連続ではずれる場合もある。 確率を普通のプログラムで作っても確率通りにはならない。 したがって5回当たるように人為的に余分なプログラムを付け足す必要がある。 カオス理論のように、確率異常もありえますからね。