从JavaScript数组中选择随机项而不重复

时间:2014-09-27 22:06:39

标签: javascript arrays random

我试图从数组中获取一个随机数而不重复但使用var newx = Math.floor(Math.random()* array.length);是随机的,但它按长度而不是数组内的内容,所以它往往会重复。

<html>
    <head>

    </head>
    <!-- <body> -->
        <button onclick="myFunction()">Difficulty</button>
        <p id="demo">here</p>
        <p id="test"></p>
        <script>



function myFunction() {

      function shuffle(o){ //try this shuffle function
          for(var j, g, t = o.length; t; j = Math.floor(Math.random() * t), g = o[--t], o[t] = o[j], o[j] = g);
          return o;
      };

    var i;    var l;    var y;    var n;
    var newx;   var newy;
    var useranswer;   var amountX;    var largest;
    var copyAmountX;
    var mixAlot;

    var x = parseInt(prompt("What is the first number?"+" "+"(up to 12)"));

    if (x < 13) {
       y = prompt("what is the second number?"+" "+"(choose up to 12)");
       n = prompt("how many problems to be solved?");
       amountX = []

       // adds to an array equal to x (user input)
       if (!amountX.length) {
        for (var s = 0; s <= x; s++) {
            amountX.push(s);
        }
       };
       // just to let me know if it is working. Will be taken out.
       alert(amountX);
        largest = Math.max.apply(Math, amountX);
       alert(largest);
       alert(isNaN(x));
    }
    else {
        alert("Refresh page and restart with numbers under 12")
    };
    if (y > 12 == true) {
        alert("Refresh page and restart with numbers under 12")
    };

    i = 0;
    l = amountX.length;
    copyAmountX = amountX;
    // where the core magic of everything happens.
    while (x < 13 && y < 13 && i<n) {
      newx = shuffle(copyAmountX);
      newy = Math.floor(Math.random() * y);
      useranswer = prompt("Multiply "+newx+" by "+newy)
        if (useranswer == newx * newy) {
            alert("Correct! problem "+(i+1)+" of "+n);
        };
        if (amountX == 0) {alert("You have completed your Difficulty! Good Game"); n = 0;
        };
        i++;
    };
};
</script>


    </body>
</html>

1 个答案:

答案 0 :(得分:4)

如果你想从数组中获取随机数,那么我会推荐一种不同的方法:复制数组,然后随机播放副本。

function shuffle(o){ //try this shuffle function
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
};

这样,您可以保持从混洗数组中弹出元素;它们总是随机的,只会发生一次。


现在关于你的代码,我担心它有很多错误:...我删除了这部分

<强>修正:

我纠正了你的程序,它现在运行得很好。请仔细检查并应用我在javascript中评论的更改。 Link