0

所以我正在编写这个脚本。当我完成它时,它应该用于制作 2-and-2 组。但无论如何; 脚本开头的“输入”数组将从我的 HTML 文件中获得 22 个不同的输入。作为标准,我给他们的值是 1-22。问题是我的两个块“第一个数字”和“第二个数字”效果不佳:它们没有返回正确的数字。因为我希望每个 elev[x] 都使用一次!不是2次,不是0次,一次!并且这些块像其中一些一样返回两次,其中一些甚至没有被使用。那么我该如何解决这个问题呢?

    function Calculate(){
    var elev = [];
    var inputs = document.getElementsByName("txt");
    for(i=0; i<inputs.length; i++) {
    elev[i] = {
        "Value": inputs[i].value,
        "Used": false
    };
}

    function shuffle(elev){
    var len = elev.length;
    for(i=1; i<len; i++){
        j = ~~(Math.random()*(i+1)); 
        var temp = elev[i];
        arr[i] = elev[j];
        arr[j] = temp;
        }
    }

    for(var v=0; v<1; v++) {
        shuffle(elev);
        document.write(elev + '<br/>\n');
    }}

是的,我在编程方面还是新手,我只想学习我能学到的东西。

通过费雪-耶茨洗牌解决了问题。

4

2 回答 2

0

您只会获得一次随机数,然后在尚未使用它们时处理它们。

我建议对数组 ( elev.sort(function() {return Math.random()-0.5})) 进行改组,然后只遍历结果而不使用更多随机数。

于 2013-01-23T18:49:38.100 回答
0

改组数组并对其进行迭代的想法是正确的,但是,通过掷硬币比较器进行排序(一种常见的错误实现;由另一个答案建议)不是改组数组的正确方法;它会产生非常倾斜的结果,甚至不能保证完成。

除非您愿意获取 underscore.js ( arr = _.shuffle(arr)),否则建议使用 Fisher-Yates shuffle:

function shuffle(arr){
  var len = arr.length;
  for(var i=1; i<len; i++){
    var j = ~~(Math.random()*(i+1)); // ~~ = cast to integer
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}

...

shuffle(elev);
for(var i=0; i<elev.length; i++){
  //do something with elev[i]
  console.log(elev[i].Value);
}

另外,请注意对象字段应该是小写,而不是大写(value', not 'Value'). Also, theUsed`字段不应该是必需的,因为您现在按顺序迭代。此外,您是否有机会使用值数组?它们似乎是您对象中的唯一字段。

另外,不要使用 document.write()。在页面加载后使用时,它不能按预期工作。如果你想在文档中附加一些东西,你讨厌 jQuery 和其他框架,并且你不想走很长的路来创建和组合 DOM 节点, document.body.innerHTML +=仍然比document.write()(但仍然考虑附加DocumentFragments 代替)更好。

演示:http: //jsfiddle.net/honnza/2GSDd/1/

于 2013-01-23T19:05:38.197 回答