2013-06-23 26 views
1

隨機選擇對我有這樣從一個數組

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

我要搶推,以便這些條目的隨機數,並在一個新的數組拉高到了一個極限的陣列。

即如此,例如,如果我進入(5) - 它會命令中隨機到一個新的數組像

[1, 4, 7, 10, 12]

我試圖

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 
var newArr = [], num, roll; 
//remove number from array 
for(var i =0; i < arr.length; i++) { 
num = Math.floor(Math.random() * arr.length); 
newArr.push(arr[num]); 
roll = arr.splice(num, 1); 
} 

但它並沒有真正的回報我需要保留的訂單需要什麼。如果有幫助,我正在使用下劃線?

+0

確定好可以爲您提供在JavaScript的解決方案?它仍然是有用的網站成員 – Andy

+0

你的公式是更多的perlin噪聲隨機,所以你也可以抓緊你的數組條目通過隨機跳'i'到你想要的數組已滿,然後對其進行分類。 –

+0

好吧,[這一個](http://stackoverflow.com/q/11935175/102441) – Eric

回答

-1

只是爲了幫助在這裏 - 你或許應該這樣做@ Eric的鏈接上面

function getRandomSubarray(arr, size) { 
    var shuffled = arr.slice(0), i = arr.length, min = i - size, temp, index; 
    while (i-- > min) { 
     index = Math.floor(i * Math.random()); 
     temp = shuffled[index]; 
     shuffled[index] = shuffled[i]; 
     shuffled[i] = temp; 
    } 
    return shuffled.slice(min); 
} 

var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]; 

var newArr = getRandomSubarray(x, 6).sort(function(a,b) { return a - b }); 

console.log(newArr) 

這應該回報你在找什麼。雖然這對我來說太大了。使用underscore

function randomSort(a, n) { 
    return _.take(_.shuffle(a), n).sort(function(a,b) { return a - b }); 
} 

console.log(randomSort(x, 6)) 
+0

也暗示的那樣,如果你使用這個'var x = [1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15] .reverse();' – Xotic750

+0

你在開玩笑嗎? OP在什麼時候要求?閱讀問題並回答答案。 – Tim

+0

爲什麼我會開玩笑?他什麼時候沒有?您只需添加註釋等信息,您的答案就會得到改善。我已經做了。你認爲他的意思是「對」還是「像一個數組」,以及「我需要保持秩序」?不可否認,OP的問題並不十分清楚,但這並不意味着我們的答案不需要。此外,您甚至可以提供有關您正在使用的隨機播放的背景/鏈接信息,Fisher-Yates(事實上可以擁有我),但是我會認爲這是不必要的。 – Xotic750

-1

這裏的另一種選擇:

function getRandomSorted(arr, limit) { 

    limit = limit || 1; 
    var random = []; 

    for (var i=0; i<limit; i++) { 
    var rand = arr[0|Math.random() * arr.length]; 
    if (~random.indexOf(rand)){ --i; continue; } 
    random.push(rand); 
    } 

    return random.sort(function(a,b){ return a-b }); 
} 

getRandomSorted(arr, 5); 

這將與字符串和數字工作。

+0

如果你使用這個'var x = [1,2,3,4,5,6,7,8,9,10,11,12,13],那麼將不會使用稀疏數組,並且沒有正確的順序,14,15] .reverse();' – Xotic750

+0

我沒有看到你在哪裏獲得這些要求,這在OP的例子中顯示的效果很好。無論如何,問題已關閉。 – elclanrs

+0

標題中的「pairs」一詞,「我喜歡的數組」也是「like」,「我需要保留的順序」,除非數組以開頭排序,那麼排序會改變訂購。但是,是的,這個問題已被標記爲重複,但我不認爲它與提到的問題是一樣的。 – Xotic750

0

我認爲這是你正在努力實現的。使用稀疏數組並維護原始元素索引。使用等於或大於所提供數組長度的count屬性將返回該數組的一個副本。

的Javascript

/*jslint maxerr: 50, indent: 4, browser: true, bitwise: true */ 
/*global console */ 

(function() { 
    "use strict"; 

    function customRand(array, count) { 
     var length = array.length, 
      indexes = [], 
      result = [], 
      i = 0, 
      rand, 
      temp; 

     while (i < length) { 
      if (Object.prototype.hasOwnProperty.call(array, i)) { 
       indexes.push(i); 
      } 

      i += 1; 
     } 

     i = 0; 
     length = indexes.length; 
     while (i < length) { 
      rand = (Math.random() * i) | 0; 
      temp = indexes[i]; 
      indexes[i] = indexes[rand]; 
      indexes[rand] = temp; 
      i += 1; 
     } 

     indexes = indexes.slice(0, count).sort(function (a, b) { 
      return a - b; 
     }); 

     i = 0; 
     length = indexes.length; 
     while (i < length) { 
      result[indexes[i]] = array[indexes[i]]; 
      i += 1; 
     } 

     return result; 
    } 

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; 

    console.log(customRand(arr, 5)); 
}()); 

jsfiddle