web-dev-qa-db-fra.com

Tri d'un tableau dans un ordre aléatoire

J'essaie de comprendre comment trier un tableau dans un ordre aléatoire fonctionne. J'ai donc trouvé le code suivant:

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

ma principale question est de savoir pourquoi ils utilisent 0,5 et non un autre numéro ? et comment cela fonctionne vraiment essayez de le simplifier, je suis nouveau en javascript et je me bats avec ces choses

12
Med Amine Elwere

Vous avez utilisé

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

Et voici la chose la plus importante est as.sort(func).func(a,b) retournera une valeur dans la plage de [-0.5,0.5].

Parce que cette fonction renvoie 0.5 - Math.random() et Math.random () renverra la valeur float comprise dans la plage de [0,1]. Ainsi, votre func renverra une valeur dans la plage de [-0.5,0.5].

Et cela signifie que cet ordre de tri sera défini avec increase ou decrease. Ceci est aléatoire . Donc, votre résultat sera aléatoire

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return Math.random();
}  

console.log(s);

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0 - Math.random();
}  

console.log(s);

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

7
Jin

Math.random () retourne un nombre compris entre 0 and 1 (exclusif). Nous utilisons 0.5 car il s’agit de la valeur moyenne.

Array.sort () trie les paramètres en fonction de la valeur de retour. Donc, 0.5 - Math.random() donnera valeur positive ou négative avec une probabilité égale. Par conséquent, il va trier les paramètres au hasard.

Comment ça marche vraiment

  • Si la valeur renvoyée par Array.sort est positive, alors l'index du premier paramètre Sera supérieur à celui du second.
  • Si c'est négatif, alors l'index du second paramètre sera plus haut que celui du premier.
  • Et, s'il s'agit de 0, alors ne rien faire.
9
rv7

Math.random () renvoie une valeur aléatoire comprise entre 0 à 1 (0 est inclus, mais 1 est exclu)} [ . Donc, 0,5 agit comme point médian. Si vous utilisez une valeur telle que supérieure à 1 ou inférieure à 0, elle sera toujours vraie ou fausse… .. Donc, pour cette raison, 0,5 est utilisé.

Vous pouvez en lire plus ici sur Math.random ()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

Comprenons un peu plus avec des exemples

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

C'est ce que vous obtenez lorsque vous utilisez une valeur supérieure à 1 

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 1 - Math.random();
}  

console.log(s);

C'est ce qui se passe lorsque vous utilisez une valeur inférieure à 0

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return -1 - Math.random();
}  

console.log(s);

P.S: - 

  1. Essayez d’imprimer la sortie de toutes les conditions ci-dessus, vous constaterez que les deux dernières conditions renvoient toujours la valeur true ou false de la fonction. de sorte que vous ne ferez pas un tri aléatoire.

  2. Maintenant, parlez de toute valeur comprise entre 0 et 0,99, vous pouvez utiliser n’importe quelle valeur, mais 0,5 vous conviendra mieux. Parce que c’est un point central, vous obtiendrez probablement la meilleure réponse. 

5
Code Maniac

Si vous voulez simplement déplacer les éléments près de leur position de départ de façon aléatoire, utilisez bien sort avec random, mais dans la plupart des cas, ce n'est pas ce que vous voulez. Vous voulez bien mélanger un tableau, complètement randomiser la position de chaque élément. Et pour cette fonction random dans la fonction sort intégrée, c’est une pratique terrible, car elle est biaisée en faveur de l’état initial, ce qui signifie que les éléments du tableau "brassés" tendent à rester près de leur position (ceux qui étaient au début ont la forte probabilité de rester près du début, etc ...). Plus la taille de la matrice est grande, moins elle est mélangée.

Voici la preuve: Est-il correct d'utiliser la méthode JavaScript Array.sort () pour le brassage?

Et voici la fonction pour mélanger les tableaux que j'utilise le plus souvent. Il randomise complètement la position de chaque élément.

function shuffle(arr) { // randomly rearanges the items in an array
  const result = [];
  for (let i = arr.length-1; i >= 0; i--) {
    // picks an integer between 0 and i:
    const r = Math.floor(Math.random()*(i+1));   // NOTE: use a better RNG if cryptographic security is needed
    // inserts the arr[i] element in the r-th free space in the shuffled array:
    for(let j = 0, k = 0; j <= arr.length-1; j++) {
      if(result[j] === undefined) {
        if(k === r) {
          result[j] = arr[i];    // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed. 
          break;
        }
        k++;
      }
    }
  }
  return result;
}
1
Kresimir

Math.random renvoie un nombre compris entre 0 et 1.

La fonction de tri utilise la valeur de retour x comme suit:

  • x == 0: même valeur, possibilité de commander "comme il le veut"

  • x < 0: le premier objet est inférieur à le second, son index dans le tableau trié sera donc inférieur à celui de l'autre

  • x > 0 idem que x < 0 mais l'inverse

Puisque Math.random renvoie un nombre compris entre 0 et 1 et que nous souhaitons également obtenir des nombres négatifs, nous devons soustraire une valeur. Ici 0.5 - Math.random() donnerait un nombre compris entre 0.5 et -0.5

1
Vivick

Si vous appelez la méthode sort avec un paramètre de fonction, il est appelé plusieurs fois. Cette fonction doit accepter deux paramètres (appelons le premier A et le second B). Chaque fois, elle doit renvoyer une valeur:

  1. Inférieur à zéro, si A <B
  2. Égal à zéro, si A = B
  3. Plus grand le zéro, si A> B

Ainsi, dans cet exemple, nous avons besoin de valeurs de retour aléatoires répartissant de manière égale les valeurs négatives et positives. Puisque Math.random() renvoie une valeur comprise entre 0 et 1, 0.5 - Math.random() renverra des valeurs comprises entre -0,5 et 0,5, ce qui répond aux exigences.

0
yunzen