0

The title basically describes my problem... I wanted to get 3 elements from an array list without getting a duplicate. Because the others I have found uses the Math.floor((Math.random() * list.length)) which I think is only limited to one output.

TofuBoy
  • 11
  • 3
  • 1
    Take a look at thismaybe? [how-to-get-a-number-of-random-elements-from-an-array](https://stackoverflow.com/questions/19269545/how-to-get-a-number-of-random-elements-from-an-array) – Mara Black Nov 22 '20 at 11:45
  • Then do it 3 times – casraf Nov 22 '20 at 11:45
  • Thanks Mara Black :) also casraf, if I just do it 3 times there's a possibility to get a duplicate. anyways~ – TofuBoy Nov 22 '20 at 12:04
  • 1
    Just [shuffle the array](https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array) and grab the first three elements – Lioness100 Nov 22 '20 at 12:23

1 Answers1

0

n unique elements from a set are a combination.

Without getting in too much detail, combinations = variations * permutations, which means we can just generate a variation (of the same length) and ignore the order.

The Fisher-Yates shuffle can do this for example:

function shuffled(elements){
    // Return shuffled elements such that each variation has the same probability
    const copy = [...elements];
    for(let i = copy.length - 1; i >= 0; i--){
        let j = Math.floor(Math.random() * (i + 1)); // 0 <= j <= i
        let tmp = copy[i];
        copy[i] = copy[j];
        copy[j] = tmp;
    }
    return copy;
}
function choose(elements, n){
    // Return a combination of n elements
    return shuffled(elements).slice(0, n);
}

var elements = ['a', 'b', 'c', 'd'];

var N = 1000;
var results = {}; // how many times each element was chosen
for(let i = 0; i < N; i++){
    for(let x of choose(elements, 3)){
        results[x] = (results[x] || 0) + 1;
    }
}

console.log(results); // 3/4 * N = 750
Patrolin
  • 106
  • 1
  • 5