2016-12-28 51 views
1

我有數字1的陣列,以60分發數組元素隨機到新的陣列

var originalArray = [1, 2, 3, 4 .... 58, 59, 60] // etc

欲 - 根據圖2和4之間的另一種數 - 隨機分裂這些數字成的數量指定的數組,並且結果每次都是唯一的。

例如:

distributeArray(2)應導致陣列,每個陣列有30個號碼隨機地從原來的陣列選擇。

distributeArray(3)應導致三個數組,每個數組有20個數字從原始數組中隨機選擇。

我認爲這是一個相當普遍的情況,所以任何指針將不勝感激。提前致謝。

+3

隨機播放的陣列和將它分成'N'部分?兩者之前都被問過:[如何隨機化(混洗)JavaScript數組?](http://stackoverflow.com/q/2450954/218196),[將數組拆分成塊](http://stackoverflow.com/q/8495687/218196) –

+0

@FelixKling - 謝謝,沒想到那個!我發現這個其他答案對於如何做到這一點很有用,如果其他人感興趣:http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript – Paulos3000

回答

0

你可以做這樣的事情,首先洗牌,然後將數組拆分成n部分。

var arr = [...Array(61).keys()].slice(1) 
 

 
function splitRandom(data, n) { 
 
    var seen = []; 
 
    var counter = 0; 
 

 
    var shuffle = data.reduce(function(r, e) { 
 
    function random() { 
 
     var rand = parseInt(Math.random(0, arr.length) * arr.length); 
 
     if (seen.indexOf(rand) != -1) { 
 
     return random() 
 
     } else { 
 
     seen.push(rand) 
 
     return rand; 
 
     } 
 
    } 
 

 
    r[random()] = e; 
 
    return r; 
 
    }, []) 
 

 
    var split = shuffle.reduce(function(r, e) { 
 
    var c = counter++; 
 
    r[c] = r[c].concat(e) 
 
    counter = counter % n; 
 
    return r; 
 
    }, Array(n).fill([])) 
 

 
    return split; 
 
} 
 

 
console.log(JSON.stringify(splitRandom(arr, 3))) 
 
console.log(JSON.stringify(splitRandom(arr, 10))) 
 
console.log(JSON.stringify(splitRandom(arr, 50)))

0

可以創建它創建的n.length陣列,和x.length陣列的功能。使用do..while循環Array.prototype.splice()originalArray,.push()中刪除隨機索引,該元素爲x之一,隨機數組,直到originalArray.length求值爲false,返回包含值的數組數組。

const randomArrays = (n, x) => { 
 
    
 
    let [originalArray, result, len] = [ 
 
    Array.from({length: n}, (_, key) => key) 
 
    , Array.from({length: x},() => []) 
 
    , Math.ceil(n/x) 
 
    ]; 
 
    do { 
 
    let [curr, index] = [ 
 
     originalArray 
 
     .splice(Math.floor(Math.random() * originalArray.length), 1) 
 
     .pop() 
 
     , Math.floor(Math.random() * result.length) 
 
    ]; 
 
    if (result[index].length < len) 
 
     result[index].push(curr); 
 
    else 
 
     for (let i = 0; i < result.length; i++) { 
 
     if (result[i].length < len) { 
 
      result[i].push(curr); 
 
      break; 
 
     } 
 
     } 
 
    } while (originalArray.length); 
 
    
 
    return result 
 
    
 
} 
 

 
console.log(
 
    randomArrays(60, 3) 
 
    , randomArrays(21, 7) 
 
    , randomArrays(5, 3) 
 
    , randomArrays(27, 5) 
 
);