2011-02-23 214 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] 

感覺就像這大概是圖論解決的問題 - 某種網絡穿越的一個最大/最小成本函數。