Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中生成带有条件的随机数字序列?_Javascript - Fatal编程技术网

如何在JavaScript中生成带有条件的随机数字序列?

如何在JavaScript中生成带有条件的随机数字序列?,javascript,Javascript,我试图从1-7生成一个数字序列。完全随机的。数字的前面或后面不能有一个以1分隔的数字 例如:[2,4,1,6,3,7,5] 不是:[5,4,2,6,7,1,3]。 另外,一个数字不能有其位置的编号(不是:[1、2、3、4、5、6、7]) 即使我在while循环中声明了所有这些条件,它也会离开循环而不满足所有条件。我需要一些帮助来找出问题所在/更好的解决方法 var randomOrder = []; for (i = 0; i < 7; i++) { randomOrder[i]

我试图从1-7生成一个数字序列。完全随机的。数字的前面或后面不能有一个以1分隔的数字

例如:[2,4,1,6,3,7,5]
不是:[5,4,2,6,7,1,3]。
另外,一个数字不能有其位置的编号(不是:[1、2、3、4、5、6、7])

即使我在while循环中声明了所有这些条件,它也会离开循环而不满足所有条件。我需要一些帮助来找出问题所在/更好的解决方法

var randomOrder = [];

for (i = 0; i < 7; i++) {
    randomOrder[i] = Math.round(Math.random() * 6 + 1);
    if (i > 0) {
        while ((randomOrder.lastIndexOf(randomOrder[i], i - 1) != -1) && (((randomOrder[i - 1] - 1) != randomOrder[i]) && ((randomOrder[i - 1] + 1) != randomOrder[i]) && (randomOrder[i] != (i + 1))) {
            randomOrder[i] = Math.round(Math.random() * 6 + 1);
        }
        alert(randomOrder.lastIndexOf(randomOrder[i], i - 1));
        alert(randomOrder);
    }
}
var randomOrder=[];
对于(i=0;i<7;i++){
randomOrder[i]=Math.round(Math.random()*6+1);
如果(i>0){
而((randomOrder.lastIndexOf(randomOrder[i],i-1)!=-1)&((randomOrder[i-1]-1)!=randomOrder[i])&((randomOrder[i-1]+1)!=randomOrder[i])&(randomOrder[i]!=(i+1))){
randomOrder[i]=Math.round(Math.random()*6+1);
}
警报(randomOrder.lastIndexOf(randomOrder[i],i-1));
警报(随机顺序);
}
}
您的代码在第7行中缺少一个)。 以下是正确循环的固定版本:

var randomOrder = [];

for (i = 0; i < 7; i++) {
    randomOrder[i] = Math.round(Math.random() * 6 + 1);
    if (i > 0) {
        while ((randomOrder.lastIndexOf(randomOrder[i], i - 1) != -1) && (((randomOrder[i - 1] - 1) != randomOrder[i]) && ((randomOrder[i - 1] + 1) != randomOrder[i]) && (randomOrder[i] != (i + 1)))) {
            randomOrder[i] = Math.round(Math.random() * 6 + 1);
        }
        alert(randomOrder.lastIndexOf(randomOrder[i], i - 1));
        alert(randomOrder);
    }
}
var randomOrder=[];
对于(i=0;i<7;i++){
randomOrder[i]=Math.round(Math.random()*6+1);
如果(i>0){
而((randomOrder.lastIndexOf(randomOrder[i],i-1)!=-1)&((randomOrder[i-1]-1)!=randomOrder[i])&((randomOrder[i-1]+1)!=randomOrder[i])&(randomOrder[i]!=(i+1))){
randomOrder[i]=Math.round(Math.random()*6+1);
}
警报(randomOrder.lastIndexOf(randomOrder[i],i-1));
警报(随机顺序);
}
}
您的代码在第7行中缺少一个)。 以下是正确循环的固定版本:

var randomOrder = [];

for (i = 0; i < 7; i++) {
    randomOrder[i] = Math.round(Math.random() * 6 + 1);
    if (i > 0) {
        while ((randomOrder.lastIndexOf(randomOrder[i], i - 1) != -1) && (((randomOrder[i - 1] - 1) != randomOrder[i]) && ((randomOrder[i - 1] + 1) != randomOrder[i]) && (randomOrder[i] != (i + 1)))) {
            randomOrder[i] = Math.round(Math.random() * 6 + 1);
        }
        alert(randomOrder.lastIndexOf(randomOrder[i], i - 1));
        alert(randomOrder);
    }
}
var randomOrder=[];
对于(i=0;i<7;i++){
randomOrder[i]=Math.round(Math.random()*6+1);
如果(i>0){
而((randomOrder.lastIndexOf(randomOrder[i],i-1)!=-1)&((randomOrder[i-1]-1)!=randomOrder[i])&((randomOrder[i-1]+1)!=randomOrder[i])&(randomOrder[i]!=(i+1))){
randomOrder[i]=Math.round(Math.random()*6+1);
}
警报(randomOrder.lastIndexOf(randomOrder[i],i-1));
警报(随机顺序);
}
}

我将考虑的方法概述:

对于每个位置,计算该位置的可能数字集,并从该列表中随机选择

位置0集合将为[2…7],位置1的集合将为[1,3…7]减去由于位置0的选择而移除的集合


如果失败,则从头开始重新启动,直到失败为止(如果某个位置的可能性集为空,则失败)。

我将考虑的方法概述:

对于每个位置,计算该位置的可能数字集,并从该列表中随机选择

位置0集合将为[2…7],位置1的集合将为[1,3…7]减去由于位置0的选择而移除的集合


如果失败,则从头开始重新启动,直到失败为止(如果某个位置的可能性集为空,则失败)。

假设采用蛮力方法:

var list=[1,2,3,4,5,6,7];
当(
list.findIndex(函数(v,i){
返回v==i+1 | |(i&&Math.abs(list[i-1]-v)==1);
}) != -1
) {
sort(函数(){return Math.random()-0.5;});
}

文件。写入(列表。加入(“”))假设采用蛮力方法:

var list=[1,2,3,4,5,6,7];
当(
list.findIndex(函数(v,i){
返回v==i+1 | |(i&&Math.abs(list[i-1]-v)==1);
}) != -1
) {
sort(函数(){return Math.random()-0.5;});
}

文件。写入(列表。加入(“”))我认为主要问题是使用&(AND)而不是| |(OR)

var result=[],current,last=无穷大,i;
而(结果长度<7){
i=0;
而(++i<1000&(!current | | result.包括(current)| |(current==last-1)| |(current==last+1)| |(current==result.length))){
current=1+(Math.random()*7)| 0;//使用您选择的楼层
}
如果(i>=1000){result.length=0;continue;}
结果:推送(电流);
last=当前值;
}

我认为主要问题是使用&(AND)而不是| |(OR)

var result=[],current,last=无穷大,i;
而(结果长度<7){
i=0;
而(++i<1000&(!current | | result.包括(current)| |(current==last-1)| |(current==last+1)| |(current==result.length))){
current=1+(Math.random()*7)| 0;//使用您选择的楼层
}
如果(i>=1000){result.length=0;continue;}
结果:推送(电流);
last=当前值;
}

在我看来,这是一项非常昂贵的操作。@Jai在任何现代设备上运行此代码都不到一毫秒。微观优化这只是浪费时间。我认为你必须反过来做。而(randomOrder[i]!=(i+1))将一直运行,直到得到[1,2,3…]。所以你想要:while(随机顺序[i]==(i+1)或…。只是想知道——这有一个现实世界的用例吗?@谁是谁?哈哈,是的。这是为了一个项目。它非常有用,我保证:在我看来,这是一个非常非常昂贵的操作。@Jai在任何现代设备上运行这段代码都不到一毫秒。微观优化这只是浪费时间。我认为你必须反过来做。而(randomOrder[i]!=(i+1))将一直运行,直到得到[1,2,3…]。所以你想要:while(随机顺序[i]==(i+1)或…。只是想知道——这有一个现实世界的用例吗?@谁是谁?哈哈,是的。这是为了一个项目。这是非常有用的,我保证:虽然这段代码应该可以工作,但随着时间的推移,它会变得越来越慢,所以你可能需要对它进行优化。这允许重复值。现在有一个新的(更严重的)问题,那就是它可能会进入si