2017-06-09 3 views
0

Désolé, cette application est bizarre; Je ne savais pas où poser la question, cependant! Je travaille sur quelques problèmes, et j'ai trouvé le Shuffle de Fisher-Yates, mais je veux savoir si ce premier shuffle auquel je pensais est uniforme ou pas? Je ne suis pas le plus grand avec la probabilité .. ou les maths ... Ha.Est-ce que cette mise en œuvre d'un «brassage uniforme» sur place?

L'idée est assez simple; Pour autant d'éléments qu'il y a dans le tableau, choisissez deux au hasard et échangez-les l'un avec l'autre.

function inPlaceShuffle(arr) { 
    const floor = 0, 
      ceil = arr.length - 1; 

    let i = arr.length; 

    while (i > 0) { 
     swap(arr, getRandom(floor, ceil), getRandom(floor, ceil)); 

     i--; 
    } 

    return arr; 
} 

function swap(arr, firstIndex, secondIndex) { 
    const temp = arr[firstIndex]; 
    arr[firstIndex] = arr[secondIndex]; 
    arr[secondIndex] = temp; 
} 

function getRandom(floor, ceil) { 
    floor = Math.ceil(floor); 
    ceil = Math.floor(ceil); 
    return Math.floor(Math.random() * (ceil - floor + 1)) + floor; 
} 

Répondre

0

Notez que chaque itération de la boucle donne n^2 combinaisons d'index pour le changement, et n itérations donnent n^(2n) variantes, mais cette valeur ne divise pas n! permutations uniformément pour n>2, de sorte que certaines permutations auront probabilité plus élevée que les autres.

exemple clair:
Il y a 729 résultats pour 6 permutations de {1,2,3}, 729/6 = 121. , donc la probabilité de permutations varie.