【问题标题】:javascript random in a loopjavascript随机循环
【发布时间】:2014-11-30 21:53:25
【问题描述】:

我有一个循环,它生成一个介于 0 和 5 之间的随机数并在数组中获取颜色。

第一种颜色总是黄色,我不知道为什么。

var hexColors = new Array("#000000", "#FFFFFF", "#FF0000", "#0000FF", "#00FF00", "#FFFF00");
var nameColors = new Array("White", "Red", "Blue", "Black", "Green", "Yellow");

for (var i = 5; i >= 0; i--) {
  var hexColor = randomNum(i);
  var nameColor = randomNum(i);
  $('td:eq(' + i + ')').css("color", hexColors[hexColor]);
  $('td:eq(' + i + ')').html(nameColors[nameColor]);
  hexColors.splice($.inArray(hexColors[hexColor], hexColors), 1);
  nameColors.splice($.inArray(nameColors[nameColor], nameColors), 1);
}

function randomNum(max) {
  return Math.floor(Math.random() * max);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
  <tr>
    <td>4</td>
    <td>5</td>
    <td>6</td>
  </tr>
</table>

我重构了循环,使它使用增量而不是 i-- 它可以工作,但我仍然想知道为什么它不能反过来工作。

【问题讨论】:

    标签: javascript jquery for-loop random


    【解决方案1】:

    “黄色”总是第一个,因为 randomNum 返回一个介于 0 和 i 之间的数字,但在您的情况下,i 介于 0 和 5 之间。四舍五入导致 i 介于 0 和 4 之间。结果,由于splicing,您将获得两个数组yellow 中的最后一个元素。这就是为什么yellow 永远是第一位的。

    这可以通过将 i 加 1 作为 randomNum 的参数来解决。

    for (var i = 5; i >= 0; i--) {
      var hexColor = randomNum(i+1);
      var nameColor = randomNum(i+1);
    
      /* ... */
    }
    

    http://jsfiddle.net/volter9/2d3k4p7n/

    我希望这可以解释为什么它是黄色并解决您的问题。

    P.S.:new Array[] 慢(数组字面量)source

    【讨论】:

      【解决方案2】:

      您的函数 randomNum(max) 将返回最大值 max-1,所以 4 ! (不是 5 个)

      那是因为 Math.random() 实际上返回一个浮点数 0 和 1 EXCLUDING 1 !!!

      这个有效:

      function randomNum(max) {
          return Math.floor(Math.random() * (max+1));
      }
      

      【讨论】:

      • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。同时,请不要使用答案发布 cmets。
      • 所以我有一个很好的答案,但我不能给出它,因为你不喜欢在答案中阅读 cmets?酷...顺便说一句,我的回答并不是真正的“评论”..
      • 在您编辑之前,这不是答案。这只是对 mrahmat 答案的评论,这在 cmets 中是可以的,但不能作为答案。
      • 不.. 我写的是关于原始功能,而不是关于 mrahamat 的答案。我刚开始回答说 mrahmat 的答案是错误的(这不是很公平……)。
      【解决方案3】:

      Alexandre Dees 的回答是正确的,我会给你详细的:

      1. randomNum 只会给你从0 到但不包括max 的随机整数。这是因为Math.random() 返回一个介于0 之间的数字,但不包括1。即使是这样,获得1 的概率也会非常小,很可能您每次仍然会在第一个项目上获得黄色作为颜色。

      2. 您的颜色数组各有六个项目。在前五次迭代中,你总是会得到第一个项目,因为你的随机数总是用randomNum(array.length - 1) 生成的——这些数组中的元素数量在每次迭代时都会减少一个,就像迭代变量一样。

      3. 在最后一个迭代步骤中,您的数组仅包含一个元素:分别为 '#ffff00''Yellow'i00 * Math.random()0。因此,只有现在才能访问黄色的值。

      4. 是否有可能在使用前向迭代时,总是 last 表格单元格以黄色结束? ;-)

      【讨论】:

        猜你喜欢
        • 2012-08-28
        • 2018-03-18
        • 2022-09-24
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多