繁体   English   中英

JavaScript机率

[英]Javascript probability

我正在尝试使用Math随机对象制作一个现实的,公正的JavaScript骰子。 当我单击时,我希望2-12之间的数字出现在网页上,但不会返回。 我的代码有什么问题。

<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>

为什么不这样写:

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

var DiceNumber = RandomNumber1 + RandomNumber2;

尝试这个:

<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>

JSFiddlehttp : //jsfiddle.net/kvFE5/1/

理论上,应该重构这个要处理不显眼

虽然说实话-为什么不使用Math.random ...

您的返回语句将在到达它们时退出该方法,并且其余代码不会运行。 您也不想从该方法中调用getRandom方法,否则将有一个永无休止的循环。 而不是返回数字(因为没有人在听返回值),将其存储在变量中,然后在最后两行中使用它。

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);
}

问题是..

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
}

对于读者:关于为什么需要两次掷骰子的信息 ,请参阅骰子角色统计 -注意获得所有值的可能性相等。 也就是说,简单的Math.floor(Math.random() * 11) + 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>

您可以使用Math.floor尝试类似他的操作,该操作将数字向下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>  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM