Javascript代码帮助-返回错误

Javascript代码帮助-返回错误,javascript,loops,if-statement,Javascript,Loops,If Statement,所以我在写这个剧本。当我完成它时,它应该用于制作2和2组。但无论如何;脚本开头的“input”数组将从我的HTML文件中获得22种不同的输入。作为标准,我给了他们1-22的值。问题是我的两个街区的“第一个号码”和“第二个号码”不太好用:它们没有返回正确的号码。因为我希望每一个elev[x]都被使用一次!不是2次,不是0次,不是一次!块返回两次,其中一些块甚至没有使用。那么我该如何解决这个问题呢 function Calculate(){ var elev = []; va

所以我在写这个剧本。当我完成它时,它应该用于制作2和2组。但无论如何;脚本开头的“input”数组将从我的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');
    }}
函数计算(){
var elev=[];
var inputs=document.getElementsByName(“txt”);

对于(i=0;i您只获得一次随机数,如果尚未使用,则处理它们


我建议对数组进行洗牌(
elev.sort(function(){return Math.random()-0.5})
),然后在没有进一步随机数的情况下对结果进行迭代。

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

除非您愿意获取underline.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);
}
函数洗牌(arr){
var len=阵列长度;

for(var i=1;i
elev[r]=elev[a];elev[a]=elev[r];
不会交换两个元素。首先,它将
elev[a]
分配给
elev[r]
(丢失
elev[r]
的值),然后将相同的值分配回
elev[a]
。为什么在
shuffle
周围有一个循环?我使用了一个循环来生成多个shuffle(证明它是随机的),但我觉得您只需要一个。不要使用
document。编写
。使用DOM操作或至少
document.body.innerHTML+=
。此外,除非实现
toString
,否则对象不会很好地转换为字符串,所以打印对象数组不会有任何好处。
[1,2,3,4,5]。排序(Math.random)
给出的
[5,4,3,2,1]
几乎完全是100%的时间。不是很随机。你的洗牌算法很糟糕,即使比较器按你的预期工作。哦,听起来很简单。我会尝试这样做,看看是否有效。当我完成后,我会更新帖子。编辑:那么,我应该使用它吗?@Kolink:
for(I in 0..len-1)swap(arr,i,random(0..i))
@JanDvorak注意到这一点做得很好。我无法编辑,所以它又在这里(我将删除上一个以避免人们错误地复制)
函数shufflarray(a){var i=a.length,t,j;而(--i)t=a[i],a[i]=a[j=~(Math.random()*(i+1)),a[j]=t;}
我只是对一些事情感到困惑。什么是temp(如果没有简短的答案,请删除链接),那么“i”和“j”索引呢?我可以复制/粘贴上面的脚本吗?@Jan你忘记了
var
i
j
,洗牌通常是向下进行的,而不是向上进行的,但似乎效果不错。我很少看到其他人使用
~
来转换为整数!@PaulS。向上计数是可以的wed,它被称为inside-out方法。如果你想在洗牌的同时初始化数组,可以使用它。感谢
var
s.@user1994248,因为只要你做
x=y
,如果你还想做
y=x
“交换”,那么
x
的前一个值就会被覆盖它们,
x
现在是
y
,所以你告诉它
y=y
,这是毫无意义的。相反,你引入了一个新变量来存储
x
temp
。现在,
temp=x;x=y;y=temp;
,一切都是你想要的。@PaulS。有趣的是,
~x
x