120 votes

Créer un tableau avec des valeurs aléatoires

Comment puis-je créer un tableau de 40 éléments, avec des valeurs aléatoires de 0 à 39 ? Comme

[4, 23, 7, 39, 19, 0, 9, 14, ...]

J'ai essayé d'utiliser les solutions proposées ici :

http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm

mais le tableau que j'obtiens est très peu aléatoire. Il génère beaucoup de blocs de nombres successifs...

282voto

simonbor Points 1274

L'approche la plus courte (ES6)

// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));

Profitez-en !

0 votes

Vous avez raison. J'ai supprimé mon commentaire. Version corrigée du chemin le plus court : [...Array(20)].map(()=>{return Math.floor(Math.random()*30)}) ;

11 votes

Si on enlève les espaces de la démarche de la réponse, il y a 4 caractères de moins que celle que vous avez proposée. Bien sûr, si vous êtes intéressé par le golf, vous avez en fait laissé de côté des raccourcis faciles pour couper des caractères : [...Array(40)].map(_=>Math.ceil(Math.random()*40)); aurait 11 caractères de moins que le vôtre, et 7 de moins que l'original.

0 votes

(je n'ai pas été assez rapide pour corriger - il faut que ce soit *39 pour répondre aux critères de l'OP si on utilise Math.ceil mais nous avons supprimé l'option 0. Si nous pouvons accepter 1-40 au lieu de 0-39, cela fonctionne. Sinon, réduire un caractère d'amélioration pour revenir à Math.floor )

61voto

Phrogz Points 112337

Voici une solution qui permet de mélanger une liste de unique numéros (pas de répétition, jamais).

for (var a=[],i=0;i<40;++i) a[i]=i;

// http://stackoverflow.com/questions/962802#962890
function shuffle(array) {
  var tmp, current, top = array.length;
  if(top) while(--top) {
    current = Math.floor(Math.random() * (top + 1));
    tmp = array[current];
    array[current] = array[top];
    array[top] = tmp;
  }
  return array;
}

a = shuffle(a);

Si vous voulez autoriser des valeurs répétées (ce qui n'est pas ce que le PO voulait), alors cherchez ailleurs :)

4 votes

Cette solution est bonne si les numéros doivent être uniques, mais il s'agit d'une chose statistique/probabiliste complètement différente. J'espère que c'était clair pour le PO et que ce n'était pas pertinent dans leur cas, mais dans certains cas, cela peut avoir un grand impact sur la correction du programme. (Je ne critique pas la réponse, mais j'attire l'attention des futurs lecteurs. Vous pourriez vouloir le mentionner). Voir aussi : fr.wikipedia.org/wiki/Combinaison (distinction entre "avec" et "sans répétition")

0 votes

Var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5) ; je pense que cela fait la même chose que ci-dessus

0 votes

Comment l'exclure de la génération du nombre 0 ?

50voto

Eugene Kulabuhov Points 126

ES5 :

function randomArray(length, max) {
    return Array.apply(null, Array(length)).map(function() {
        return Math.round(Math.random() * max);
    });
}

ES6 :

randomArray = (length, max) => [...new Array(length)]
    .map(() => Math.round(Math.random() * max));

1 votes

Qu'est-ce qui se passe avec le _ y i arguments ? inutiles dans ES6, sauf erreur de ma part.

2 votes

@AfricanMatt, _ est l'élément courant et i est l'indice actuel. Vous avez raison, ils sont inutiles dans les deux cas. Vous pouvez les supprimer si vous le souhaitez.

1 votes

Je ne sais pas où vous croyez que cette version pour ES6 fonctionne ? Array.from fonctionne... voici un exemple avec votre code... randomArray = (length : nombre, max : nombre) => Array.from({length}) .map(() => Math.floor(Math.random() * max)) ;

40voto

Damjan Pavlica Points 7299

Approche ES6 encore plus courte :

Array(40).fill().map(() => Math.round(Math.random() * 40))

Vous pouvez également avoir une fonction avec des arguments :

const randomArray = (length, max) => 
  Array(length).fill().map(() => Math.round(Math.random() * max))

2 votes

.fill() requiert un paramètre de valeur

6 votes

@DamianGreen - .fill() sans aucun paramètre remplira le tableau avec undefined qui est la seule chose nécessaire ici pour .map() pour travailler

0 votes

Damjan, y a-t-il un moyen de ne pas répéter les chiffres ? J'ai aimé cette approche

37voto

Curt Points 486

Le plus court :-)

[...Array(40)].map(e=>~~(Math.random()*40))

27 votes

~~ est un raccourci pour Math.floor

1 votes

C'est génial ; est-ce qu'il y a un soutien généralisé pour cela ~~ sténographie ? (edit : ahh, c'est juste un opérateur binaire je vois)

0 votes

@Curt seulement pour les nombres positifs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X