2

Math ランダム オブジェクトを使用して、現実的な偏りのない JavaScript サイコロを作ろうとしています。クリックしたときに 2 ~ 12 の数字を Web ページに表示したいのですが、戻りません。私のコードの何が問題なのですか。

<html>
<head><title>DiceBoy</title>
</head>
<body>
<script>
function getRandom(){
  var num=Math.random();
  if(num < 0.0278) return 2; 
  else if(num < 0.0834) return 3;
  else if(num < 0.1667) return 4; 
    else if(num < 0.2778) return 5; 
      else if(num < 0.4167) return 6; 
        else if(num < 0.5834) return 7; 
          else if(num < 0.7223) return 8;
            else if(num < 0.8334) return 9; 
              else if(num < 0.9167) return 10; 
                else if(num < 0.9723) return 11;
                  else return 12;
                  var x=getRandom();
                  document.write(x);
}

</script>

<input type="button" value="Click Here" onClick="getRandom();">

</body>
</html>
4

6 に答える 6

4

このように書いてみませんか:

var RandomNumber1 = Math.floor(Math.random() * 6) + 1;
var RandomNumber2 = Math.floor(Math.random() * 6) + 1;

var DiceNumber = RandomNumber1 + RandomNumber2;
于 2013-01-31T07:25:12.910 に答える
1

これを試して:

<html>
    <head>
        <title>DiceBoy</title>
    </head>
    <body>
        <script>
            function getRandom() {
                return (Math.floor(Math.random() * 6) + 1) * 2;
            }
        </script>
        <input type="button" value="Click Here" onClick="document.write(getRandom());">
    </body>
</html>

JSFiddle: http: //jsfiddle.net/kvFE5/1/

理想的には、目立たないように処理するためにこれをリファクタリングする必要があります。

正直なところ、Math.randomを使用しないのはなぜですか...

于 2013-01-31T07:23:11.927 に答える
0

returnステートメントは、到達するとメソッドを終了し、残りのコードは実行されません。また、メソッド内からgetRandomメソッドを呼び出さないでください。そうしないと、無限ループが発生します。次に、数値を返すのではなく(戻り値を聞いている人がいないため)、数値を変数に格納してから、最後の2行で使用します。

function getRandom(){
  var num=Math.random();
  var result = 0;
  if(num < 0.0278) result = 2; 
  else if(num < 0.0834) result = 3;
    else if(num < 0.1667) result = 4; 
     .
     .
              else result =  12;
              document.write(result);
}
于 2013-01-31T07:24:37.217 に答える
0

問題はそれです ..

var x=getRandom();
document.write(x);

それ以前に関数が「戻る」ため、呼び出されることはありません。コードを関数のに移動して、ランダム化関数を呼び出して結果を使用できるようにします。

function getRandom () {
   // the long icky original code WITHOUT the following:
   // var x=getRandom();
   // document.write(x);
}
// later, OUTSIDE the function
var result = getRandom();
document.write(result);

ただし、同じ効果を得るより良い方法は、次を使用することです。

function getDiceRole() {
   return Math.floor(Math.random() * 6) + Math.floor(Math.random() * 6) + 2
}

読者へ: なぜ 2 回振る必要があるのか​​については、ダイスの役割の統計を参照してください。すべての値を取得する確率が均等ではないことに注意してください。つまり、単純Math.floor(Math.random() * 11) + 2正しくありません。

.. 2 つのサイコロを投げる場合、2 つのサイコロの合計の異なる可能性は、他のものよりもいくつかの数字を取得する方法があるため、同じ確率ではありません。

于 2013-01-31T07:26:40.233 に答える
0

このようなものを試して、2つの数値の間で乱数を生成してください

/**
 * Returns a random integer between min and max
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt (min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

あなたの場合、次のように呼び出します

 getRandomInt (2, 12);

完全なhtmlは次のようになります

<html>
<head>
<script type="text/javascript">
    /**
     * Returns a random integer between min and max
     * Using Math.round() will give you a non-uniform distribution!
     */
    function getRandomInt (min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    function generateNumber()
    {
       document.getElementById('generated-id').innerHTML = getRandomInt (2, 12);
    }

</script>
</head>
<body>
Generated number : <span id="generated-id"></span>
<input type="button" onclick="generateNumber();" value="Generate random number" />
</body>
</html>
于 2013-01-31T07:28:35.183 に答える
0

Math.floor数値を最も近い整数に丸めるを使用して、彼のようなことを試すことができます。

<html>
    <head>
        <title>DiceBoy</title>
    </head>
    <body>
        <script type="javascript/text">
            function getDieRoll() {
                return Math.floor(Math.random() * (12 - 1+ 1)) +1;
            }
        </script>
        <input type="button" value="Click Here" onClick="document.write(getDieRoll());">
    </body>
</html>  
于 2013-01-31T07:36:44.847 に答える