2011-02-23 170 views
2

如果每个数字必须是下一个/ prev数字的+3或-3,那么将数字数组进行混洗的最佳方式是什么?因此,例如[0,1]不起作用,但[0,3]会起作用。Javascript数组随机填充

谢谢!

+2

这并不总是可能的 - 你举一个例子,它不是。一般来说,你不会总是能够做到这一点。你试图解决的根本问题是什么? – tvanfosson 2011-02-23 02:14:42

+0

是的,我知道这并不总是可能的..基本上我试图建立一个突出随机图像的“图像网格” - 它循环 - 突出显示的图像有一个标签,如果它们太靠近 - 看看这个截图(这可能比试图解释它更好)http://cl.ly/261Y2F0200442e220y3z – RyanLynch 2011-02-23 02:30:25

回答

1

看看截图,你似乎想从列表中选择一个随机分类,没有2个选项在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)); 
+0

正是我想要做的。谢谢! – RyanLynch 2011-02-23 02:59:44

0

甲方式(likley不是fastes)将是:

  1. 排序阵列
  2. 挑开始与新的洗牌数组随机元素(在排序后的数组标记元件所用或删除)
  3. 使用二分查找找到最后一个元素为+3或-3的下一个元素(在-3和+3之间随机选择)。确保元素未被标记为以前使用(否则找到另一个)
  4. 重复3,直到您可以找到元素。
  5. 你要么从已排序数组中选取所有元素,要么这样的洗牌是不可能的。

我认为你得到O(N * logN)与此(排序N * logN和选择N个元素logN为每个serch)。

0

假设数组中的值不能重复。

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 
} 
0

我认为你必须以某种非标准方式使用短语“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] 

感觉就像这大概是图论解决的问题 - 某种网络穿越的一个最大/最小成本函数。