質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • JavaScript

    16943questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    9245questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • HTML5

    4158questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

javascript 勝率(当選確率)の計算について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 715

pelican

score 5

勝率(当選確率)の求め方についてご教授ください。現在、ナンバーズ3というものを作成しております。
実際に作成したコードは下記に添付いたします。
ユーザーが0〜9の整数をそれぞれ3つのテキストに入力すると、
COM:の値はrandomに整数を返すようになっております。当選結果のパターンは下記の通り、

・ユーザーの入力値とCOMの値が等しく、並び順も同じ場合
→ストレート当選

・ユーザーの入力値とCOMの値が等しい(この場合は並び順は気にしない)
→ボックス当選

・上記以外の結果の場合
→はずれ

となります。

これに対して、問題となっているのは
「ユーザーが入力した数値を1000回連続使用した場合の結果と当選勝率を求める」 についてです。

実際に下記コードに追加で処理を書きたいのですが、
求め方がいまいちよくわかりません。

注意点としては、
・少数点以下2桁まで求める
・通常の当選結果と、当選確率の2つを求めることです。

ご教授いただけると幸いです。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>js総合課題7-1</title>
</head>
  <body>
    <h1>ナンバーズ3当選確率</h1><br>
    <p>番号が全て一致し番号の並び順番も一緒の場合→ストレート当選</p>
    <p>番号が全て一致→ボックス当選</p>
    <p>その他→ハズレ</p><br>
    <input type="text" value="" size="10" name="inNumber1" id="inNum1" onblur="num1()">
    <input type="text" value="" size="10" name="inNumber2" id="inNum2" onblur="num2()">
    <input type="text" value="" size="10" name="inNumber3" id="inNum3" onblur="num3()"><br>
    <span id="inval"></span>
    <br>
    <input type="button" value="当選結果を表示" name="drawing" id="draw" onclick="check1()"><br>
    <br>
    <span>USER :</span>
    <input type="text" value="" size="5" name="disp1" id="display1">
    <input type="text" value="" size="5" name="disp1" id="display2">
    <input type="text" value="" size="5" name="disp1" id="display3"><br><br>
    <span>COM :</span>
    <input type="text" value="" size="5" name="disp2" id="display4">
    <input type="text" value="" size="5" name="disp2" id="display5">
    <input type="text" value="" size="5" name="disp2" id="display6"><br><br>
    <span id="result">当選結果 : <br><br>
    <br>
    <table border="1">
      <tr>
        <th></th>
        <th>当選確率</th>
      </tr>
      <tr>
        <td>ストレート</td>
        <td id="winning_probability1">確率:</td>
      </tr>
      <tr>
        <td>ボックス</td>
        <td id="winning_probability2">確率</td>
      </tr>
      <tr>
        <td>はずれ</td>
        <td id="winning_probability3">確率</td>
      </tr>
    </table>
    <script type="text/javascript" src="./js/js_sougo7-1.js"></script>
  </body>
</html>
//ユーザーが数値を入力した値が正しいかどうか(1)
function num1() {
  var inNum1 = document.getElementById('inNum1');
  if (inNum1.value.match(/^[0-9]{1}$/)) {
    console.log(inNum1.value);
    inval.innerHTML = "";
  }
  else {
    alert('入力した値は使用できません');
    inval.style.color = "red";
    inval.innerHTML = "0~9の半角数字1桁を入力してください";
  }
}
//ユーザーが数値を入力した値が正しいかどうか(2)
function num2() {
  var inNum2 = document.getElementById('inNum2');
  if (inNum2.value.match(/^[0-9]{1}$/)) {
    console.log(inNum2.value);
    inval.innerHTML = "";
  }
  else {
    inval.style.color = "red";
    inval.innerHTML = "0~9の半角数字1桁で入力してください";
  }
}
//ユーザーが数値を入力した値が正しいかどうか(3)
function num3() {
  var inNum3 = document.getElementById('inNum3');
  if (inNum3.value.match(/^[0-9]{1}$/)) {
    console.log(inNum3.value);
    inval.innerHTML = "";
  }
  else {
    inval.style.color = "red";
    inval.innerHTML = "0~9の半角数字1桁で入力してください";
  }
}
//「当選表示」をクリックしたらの処理
function check1() {
  if (inNum1.value === "" || inNum2.value === "" || inNum3.value === "") {
    inval.style.color = "red";
    inval.innerHTML = "値をそれぞれ入力してから実行してください";
  }
//ユーザーが入力した値をUSER:に表示させる
  var userInput = [];
  for (var i = 0; i < 3; i++) {
    userInput[i] = document.getElementById('display' + (i + 1)).value =
    document.getElementById('inNum' + (i + 1)).value;
  }

//ストレートの当選確率
  var winning_probability1 = document.getElementById('winning_probability1');
//ボックスの当選確率
  var winning_probability2 = document.getElementById('winning_probability2');
//はずれの確率
  var winning_probability3 = document.getElementById('winning_probability3');

//COMの値をrandomに取得し出力する
  var arr = [0,1,2,3,4,5,6,7,8,9];
  var cpuInput = [0,0,0];
  for (var i = 0; i < 3; i++) {
    cpuInput[i] = arr[Math.floor(Math.random() * arr.length)];
    document.getElementById('display' + (i + 4)).value = cpuInput[i];
  }
  if (userInput.toString() === cpuInput.toString()) {
    result.style.color = "red";
    result.innerHTML = "結果:ストレート当選です";
  }
  else if (userInput.sort().toString() == cpuInput.sort().toString()) {
    result.style.color = "red";
    result.innerHTML = "結果:ボックス当選です";
  }
  else {
    result.style.color = "red";
    result.innerHTML = "結果:ハズレです";
  }
}

 前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

 発生している問題・エラーメッセージ

エラーメッセージ

 該当のソースコード

ソースコード

 試したこと

000~999の1000パターンが存在しており、
ユーザーの入力値は3つ。
ストレート当選の場合は

1000パターンのうち1パターンのみなので、
計算式を書くと、
1 / 1000 * 何回当たったか * 100(パーセントにするため100を掛ける)

ストレートに倣ってボックス当選の場合、
計算式)
6 / 1000 * 何回当たったか * 100

上記以外の場合は、はずれの確率も求めたいので
はずれ / 1000 * 何回外れたか * 100

という計算式は見えてきました。
この式をどのようにして記述していいのか初心者のため理解が難しいです。。

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2018/05/15 18:27

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • Lhankor_Mhy

    2018/05/16 10:51

    勝率の計算式がかかれていますが、『ユーザーが入力した数値を1000回連続使用した場合の結果』については出力ができているのですか?

    キャンセル

  • fjaiofjawiefjaw

    2018/05/17 18:15

    質問と直接関係ありませんが、こちらの問題はどちらから参照しているのでしょうか?もし、よろしければ、サイト名などを教えて頂きたいです。面白そうですので、僕も解いてみたいです。

    キャンセル

回答 1

checkベストアンサー

+1

私は、数学が得意でないため、自信がありませんが

例えば
試行回数が1000回で
ストレート当選が10回の場合
10/1000 * 100 = 1(%)
だと思いましたが、いかがでしょうか。

つまり、
当選回数/試行回数 * 100
です。

それを元にコードを編集いたしました。
jsのみ編集いたしました。
ご希望の動作になっていますでしょうか。

※間違えていましたら、ご指摘ください。

//ストレートの当選確率dom
var $winning_probability1 = document.getElementById('winning_probability1');
//ボックスの当選確率dom
var $winning_probability2 = document.getElementById('winning_probability2');
//はずれの確率dom
var $winning_probability3 = document.getElementById('winning_probability3');
//試行回数
const trials_num = 1000;
//COMがランダムな値を得るために利用する配列
var rand_seeds = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];


//ユーザーが数値を入力した値が正しいかどうか(1)
function num1() {
  var inNum1 = document.getElementById('inNum1');
  if (inNum1.value.match(/^[0-9]{1}$/)) {
    console.log(inNum1.value);
    inval.innerHTML = "";
  }
  else {
    alert('入力した値は使用できません');
    inval.style.color = "red";
    inval.innerHTML = "0~9の半角数字1桁を入力してください";
  }
}
//ユーザーが数値を入力した値が正しいかどうか(2)
function num2() {
  var inNum2 = document.getElementById('inNum2');
  if (inNum2.value.match(/^[0-9]{1}$/)) {
    console.log(inNum2.value);
    inval.innerHTML = "";
  }
  else {
    inval.style.color = "red";
    inval.innerHTML = "0~9の半角数字1桁で入力してください";
  }
}
//ユーザーが数値を入力した値が正しいかどうか(3)
function num3() {
  var inNum3 = document.getElementById('inNum3');
  if (inNum3.value.match(/^[0-9]{1}$/)) {
    console.log(inNum3.value);
    inval.innerHTML = "";
  }
  else {
    inval.style.color = "red";
    inval.innerHTML = "0~9の半角数字1桁で入力してください";
  }
}
//ストレート当選がどうか確かめるための関数
const isStraight = ({userInput, cpuInput}) => {
  return userInput.toString() === cpuInput.toString();
}
//ボックス当選がどうか確かめるための関数
const isBox = ({userInput, cpuInput}) => {
  return userInput.sort().toString() == cpuInput.sort().toString();
}
//「当選表示」をクリックしたらの処理
function check1() {
  if (inNum1.value === "" || inNum2.value === "" || inNum3.value === "") {
    inval.style.color = "red";
    inval.innerHTML = "値をそれぞれ入力してから実行してください";
  }
  //ユーザーが入力した値をUSER:に表示させる
  var userInput = [];
  for (let i = 0; i < 3; i++) {
    userInput[i] = document.getElementById('display' + (i + 1)).value =
      document.getElementById('inNum' + (i + 1)).value;
  }
  //当選回数カウント用オブジェクト
  const win_cnt = {straight: 0, box: 0, miss: 0};
  var cpuInput = [0, 0, 0];
  for (let i = 0; i < trials_num; i++) {
    //COMの値をrandomに取得し出力する
    for (let j = 0; j < 3; j++) {
      cpuInput[j] = rand_seeds[Math.floor(Math.random() * rand_seeds.length)];
      // COMの値を出力しても目で追えるスピードでないため、コメントアウト。
      // document.getElementById('display' + (i + 4)).value = cpuInput[i];
    }
    if (isStraight({userInput, cpuInput})) {
      // 結果がストレート当選の場合

      // チェック用(結果を確かめる時に使用してください。)
      // console.log(`結果:ストレート当選 ユーザ:${userInput} COM:${cpuInput}`)
      win_cnt.straight++;
    }
    else if (isBox({userInput, cpuInput})) {
      // 結果がボックス当選の場合

      // チェック用(結果を確かめる時に使用してください。)
      // console.log(`結果:ボックス当選 ユーザ:${userInput} COM:${cpuInput}`)
      win_cnt.box++;
    }
    else {
      // 結果がハズレの場合

      // チェック用(結果を確かめる時に使用してください。)
      // console.log(`結果:ハズレ ユーザ:${userInput} COM:${cpuInput}`)
      win_cnt.miss++;
    }
  }
  console.log(win_cnt)
  $winning_probability1.innerHTML = `確率:${win_cnt.straight / trials_num * 100}%`
  $winning_probability2.innerHTML = `確率:${win_cnt.box / trials_num * 100}%`
  $winning_probability3.innerHTML = `確率:${win_cnt.miss / trials_num * 100}%`
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16943questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    9245questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • HTML5

    4158questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。