带填充的Javascript数组洗牌

带填充的Javascript数组洗牌,javascript,Javascript,在每个数字必须是下一个/上一个数字的+3或-3的条件下,洗牌一个数字数组的最佳方法是什么?例如,[0,1]不起作用,但[0,3]起作用 谢谢 一种方法(比如说斋戒)是: 排序数组 拾取随机元素以启动新的无序数组(将排序数组中的元素标记为已使用或移除) 使用二进制搜索查找下一个元素,即最后一个元素的+3或-3(在-3和+3之间随机选择)。确保元素未标记为以前使用过(否则请查找另一个) 重复3次,直到找到元素 您要么从已排序数组中拾取所有元素,要么不可能进行这种洗牌 我认为这样可以得到O(N*log

在每个数字必须是下一个/上一个数字的+3或-3的条件下,洗牌一个数字数组的最佳方法是什么?例如,[0,1]不起作用,但[0,3]起作用

谢谢

一种方法(比如说斋戒)是:

  • 排序数组
  • 拾取随机元素以启动新的无序数组(将排序数组中的元素标记为已使用或移除)
  • 使用二进制搜索查找下一个元素,即最后一个元素的+3或-3(在-3和+3之间随机选择)。确保元素未标记为以前使用过(否则请查找另一个)
  • 重复3次,直到找到元素
  • 您要么从已排序数组中拾取所有元素,要么不可能进行这种洗牌

  • 我认为这样可以得到O(N*logN)(对N*logN进行排序,并用logN为每个serch选取N个元素)。

    假设数组中的值不能重复

    function one(array, mod){
        var modArray = [];
        for(var index in array){
            var item = array[index];
            var itemMod = item%3;
            if(itemMod === mod){
                modArray.push(item);
            }
        }
        return modArray();
    }
    
    function two(modArray){
        var sortedArray = // sort highest to lowest
        for(var index in sortedArray ){
            var item = array[index];
            if(index > 0 && item[index-1] === item[index]-3){
    
            }else{return false;}          
        }
        return sortedArray.length;
    }
    
    function main(array){
        var a1 = one(array, 0);
        var a2 = one(array, 1);
        var a3 = one(array, 2);
    
        var a1c = two(a1);
        var a2c = two(a2);
        var a3c = two(a3);
    
        return // if a1c is greatest then a1, if a2c greatest then a2 ... etc
    }
    

    我想你一定是以某种非标准的方式使用了“shuffle”这个短语。如果所有的数字已经在+-3范围内,那么对数组进行排序将使它们按正确的顺序排列,除非有重复的,我猜

    更多的例子可能会有所帮助。例如,这些例子有效吗?你在寻找什么

    [0, 3, 3] -> [3, 0, 3]
    [9, 3, 6, 0, 6] -> [0, 3, 6, 9, 6]
    [3, 3, 6, 0, 6] -> [0, 3, 6, 3, 6]
    

    感觉这可能是图论中一个已解决的问题—某种具有最大/最小代价函数的网络遍历。

    查看屏幕截图,您似乎想从列表中随机选择一个组合,没有两个选择在3个之内。 这段代码获取一个数组,并给出满足该条件的数组子集。 您也可以指定最大选择数,尽管您可能不会总是获得那么多选择

    var src = [0,1,2,3,4,5,6,7,8,9,10,11,12];
    
    var getRnd = function(max){
        var output = [];
        var newSrc = src.slice();
        var test, index, i, safe;
    
        while (newSrc.length > 0 && output.length < max){
            index = Math.floor(Math.random()*newSrc.length);
            test = newSrc.splice(index,1);
            //Make sure it's not within 3
            safe = true;
            for (i=0; i<output.length;i++){
                if(Math.abs(test-output[i]) < 3){
                    //abort!
                    safe=false;
                }
            }
            if(safe){
                output.push(test);
            }
        }
    
        return output;
    
    };
    
    alert(getRnd(4));
    
    var src=[0,1,2,3,4,5,6,7,8,9,10,11,12];
    var getRnd=函数(最大值){
    var输出=[];
    var newSrc=src.slice();
    var检验,指数,i,安全;
    而(newSrc.length>0&&output.length对于(i=0;iIt不总是可能的——你给出一个不可能的例子。一般来说,你不会总是能够做到。你试图解决的根本问题是什么?是的,我知道这不总是可能的。基本上,我正在尝试建立一个“图像网格”这会突出显示随机图像--它会循环--突出显示的图像有一个标签,如果它们太近,会覆盖其他图像--请查看此屏幕截图(可能比尝试解释要好),这正是我想要做的。谢谢!