• ベストアンサー

確率の判定方法が分かりません

確率の判定方法が分かりません 変数に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) { //当たった }

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.4

他の方と同じような違うような...。 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)
回答No.5

やぁ♪2回も回答できるのかなぁ。ぼくレオ先生^^; 魚群の話は面白かった? 確実に1000回の中に5個当たりを入れるには順次を入れ替える方法がポピュラーだよ。 千個の配列の中にランダムで5個の当たりを入れる。 配列の内容をシャッフルする(順次をいれかえる) こうゆうプログラムはゲーム界ではよく使われるよ。 例えば、マージャンの初期配置とか、トランプを配る初期状態とかさ。 難しいですか?

全文を見る
すると、全ての回答が全文表示されます。
  • DPE
  • ベストアンサー率85% (666/776)
回答No.3

当たる確率が 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回しか出ないことになります。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

1000回中5回確実に当たるようにするなら 1000個のプール値の配列を作って ランダムに5個trueを潜ませて 巡回するとかいう方法もあります 頭に戻ったらまた ランダムにtrueを潜ませた プール値配列を作り直すカンジですね

全文を見る
すると、全ての回答が全文表示されます。
  • gcqd75ce
  • ベストアンサー率8% (6/67)
回答No.1

例えば、 海物語で魚群が流れるとしよう。 7回連続ではずれる場合もある。 確率を普通のプログラムで作っても確率通りにはならない。 したがって5回当たるように人為的に余分なプログラムを付け足す必要がある。 カオス理論のように、確率異常もありえますからね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 数字の分割方法について

    お世話になります。 変数$numに1~16までの数字をランダムに区切らずに代入した時、 この変数$numの値を1つずつ取り出す関数、もしくは処理方法はございますでしょうか?? ■例■ $num = 12378910; $Num = ホニャララ関数($num); echo $Num[6] "10" もしお分かりになる方がおられましたら、 ご教授をお願い申し上げます。

    • 締切済み
    • PHP
  • 簡単な当たり判定作りたい

    環境FLASH MX  ボタンオンでスタート、もう一回押すと画面上ハズレ、又は当たり表示という簡単な判定機を作りたいです。 プログラムの確率は1/10とします。ただし、完全確率方式でハズレをいったんもとに戻す。またルーレットのように回るような抽選でなく ランダム式がよいです。 ぜひ、アドバイスおねがいします!

    • ベストアンサー
    • Flash
  • 中学校数学での確率問題への解答方法で、百分率表記を認めるかどうかで少し

    中学校数学での確率問題への解答方法で、百分率表記を認めるかどうかで少しもめています。 例えば「コインを1回投げた時に表が出る確率を求めなさい」という問題に対する答えとして  (1) 1/2  (2) 50% と二通りの答え方があります。 (1)が正解なのはわかりますが, (2)に関しては正解とするか不正解とするか判断がつきません。 (2)は正解か不正解か、現在の数学教育上、どちらなのでしょうか? また、その理由についてもご教授願えたらと思います。 よろしくお願い致します。

  • 確率が重複する場合の計算方法

    調べればわかると思ったのですが、 どういうキーワードで検索すればいいかがわからず質問する事にしました。 加算ではなく複数判定がある確率の計算の方法がわかりません。 具体的には、 20%、30%、40%で連続して確率が判定され、最終的にいくつ残るかという計算の事です。 1回目の判定で100%-20%=80% 2回目の判定で80%-30%=50% 3回目の判定で50%-40%=10%・・・? とは単純にならない気がするのですが、 1回目の判定で80% 2回目で80の30%だから80*0.3=24だから80-24=56% 3回目の判定で56の40%だから56*0.4=22.4だから56-22=34%(小数点切り捨てで) となるんだと思います。 これってもっと簡単に計算出来ないものなんでしょうか? 質問する側が理解していないので曖昧な感じになってしまってすみません。

  • 外部テキストの値を得るには?

    フラッシュ初心者&質問するのが初めてなので うまく伝わるかどうか心配ですがよろしくお願いいたします。 外部テキストnum.txtにはstr=5という記述があります。 このnum.txtを取り込んで、 5という数値をflash側で変数aaaに代入しました。 --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; trace(aaa); } } --------------------------- この場合、ちゃんと5と出力されます。 しかしこの関数内のaaaという変数を他でも利用したいのです。 (例えばvar menu_num:Number = aaa;というように) 単純に下のように記述すると --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; } } var menu_num:Number = aaa; trace(menu_num); --------------------------- undefinedが出力されます。 この時にちゃんと5と出力させるにはどうしたらいいのでしょうか。 いろいろグローバル変数など勉強しましたがうまくいきません。 ちなみに外部テキストnum.txtのstr=5というのは、 5という数字のみでもかまいません。 とにかくテキストから数値を取り出す方法を考えています。 ご回答お願いいたします。

    • ベストアンサー
    • Flash
  • jQueryのCSSで値に変数を使う方法

    jQueryでCSSを設定する際、 $("div").css("プロパティ","値"); とすると思いますが、この値の部分に変数を利用することはできないのでしょうか。 何がしたいかというと、for文の中で乱数を発生させ、それを値として使いたいのです。 for(i=0; i<10; i++){ var num = Math.floor(Math.random()*100); $("div:eq(i)").css("width",num); } このように書いてみましたが駄目でした。 値に変数を使う方法はありませんでしょうか。 できない場合、このような方法(CSSの値に乱数を使う)を実現できる方法はありませんでしょうか。

  • パチンコの確率について

    確率が盤面に書いてますが、確率1/100とした場合、 全台の内の約7割以上で初当たり確率が1/150~1/200に落ち着きます。(等価の店) かと思えば、換金率が半分の店では、1/100を大きく下回ったり上回ったりとランダムで大ハマリも少ないです。 更には、土日は稼働率が上がるので、総回転数が増えるにつれて当たり数も増えるのが普通と思いますが、必ず逆で初当たり確率は大幅に悪くなります。 このことから、確率を変更出来ることは確実と推測できます。 法的に免れる設定変更方法とかあるんでしょうか?教えていただきたいです。

  • 1回も出ないときの確率

    箱にたくさんの白いボールが入っており、少しだけ赤いボールが入っているとします。 この箱からランダムに1つボールを取り出し、色を記録し、取り出したボールを戻す操作を繰り返して行います。 このとき、1回も赤いボールが出なかった場合の、赤いボールが入っている確率を求めたいです。 例えば、危険率5%とか1%(あるいは0.1%)で推定するにはどうしたらよいでしょうか。

  • コンストラクタでvar ?

    javascriptのコンストラクタについて。 下記のコードで、変数を2つ宣言しています(★)が、 下部のfor文で、その変数名を引数のstr,numにすれば、★での宣言は不要ですか? 宣言しとくと何かメリットがあるのでしょうか? var Repeater = function(str, num){ var string = str, //★ number = num;     //★ this.repeat = function (){ var i, result = ""; for(i = 0; i < number; i++ ) { result += string; } return result; }; }; new Repeater("abc", 3).repeat(); あるサイトから引用

  • 可変変数出力方法

    以下のプログラムで ========================== <html> <title>variable_variable</title> <body> <?   $number=1;   $var_1="one"; $var_2="two"; if($number==1) { $output="var_1"; } else if($number==2) { $output="var_2"; } print"$$output";//可変変数A print($$output);//可変変数B ?> </body> </html> ==========================   print"$$output";//可変変数A print($$output);//可変変数B 可変変数Aは$var_1 可変変数Bはone と出力されます。 どちらも内容は同じモノなのですが。 普段出力方法は print""; という方法を使用しているのですが、 可変変数には print(); という方法を取らないとダメなのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP