créer un tableau avec des valeurs aléatoires en javascript

Comment puis-je créer un tableau avec 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 des solutions d'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 numéros successifs...

40
demandé sur Soviut 2011-04-30 00:05:05

15 réponses

Voici une solution qui mélange une liste de numéros uniques (aucune 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 permettre des valeurs répétées (ce qui n'est pas ce que L'OP voulait) alors regardez ailleurs. :)

30
répondu Phrogz 2014-08-25 20:59:16

La plus courte approche (ES6)

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

Profitez-en!

64
répondu simonbor 2017-03-27 11:18:37

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));
34
répondu Eugene Kulabuhov 2017-02-10 17:18:31

Math.random() retournera un nombre entre 0 et 1(exclusif). Donc, si vous voulez 0-40, vous pouvez le multiplier par 40, le plus haut résultat que le résultat puisse jamais être est ce que vous multipliez par.

var arr = [];
for (var i=0, t=40; i<t; i++) {
    arr.push(Math.round(Math.random() * t))
}
document.write(arr);

http://jsfiddle.net/robert/tUW89 /

13
répondu Robert 2015-05-22 20:48:55

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

séquences d'articles aléatoires contiennent souvent des blocs de nombres successifs, voir le Fallacy du Joueur . Par exemple:

.. nous venons de lancer quatre têtes d'affilée .. Puisque la probabilité de une série de cinq têtes successives n'est que de 1⁄32 .. une personne assujettie à l' l'erreur du joueur pourrait croire que ce prochain flip était moins susceptible de chefs que d'être queues. http://en.wikipedia.org/wiki/Gamblers_fallacy

10
répondu Jared Beck 2015-05-29 21:56:19

Encore plus courte ES6 approche:

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

aussi, vous pouvez avoir une fonction avec des arguments:

const randomArray = (length, max) => 
  Array(length).fill().map(() => Math.round(Math.random() * max))
8
répondu Damjan Pavlica 2017-11-23 21:07:41

puisque la gamme des nombres est limitée, je dirais que la meilleure chose à faire est de générer le tableau, le remplir avec des nombres de zéro à 39 (dans l'ordre), puis le mélanger.

3
répondu Pointy 2011-04-29 20:07:21
var myArray = [];
var arrayMax = 40;
var limit = arrayMax + 1;
for (var i = 0; i < arrayMax; i++) {
  myArray.push(Math.floor(Math.random()*limit));
}

ceci ci-dessus est la façon traditionnelle de le faire, mais je deuxième @Pointy et @Phrogz si vous voulez éviter les doublons dans votre tableau sans avoir à faire de calcul coûteux

2
répondu forthehackofit 2011-04-29 20:36:28

Caprice d'une seule ligne de solutions sur tous les jours.

les valeurs dans les tableaux sont totalement aléatoires, donc quand vous utiliserez ce snippets, il sera différent.

Un tableau (longueur 10) avec aléatoire de caractères en minuscules

Array.apply(null, Array(10)).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); })

['k',' a',' x',' y',' n',' w',' m',' q',' b',' j']

Un tableau (longueur 10) avec des nombres entiers aléatoires de 0 à 99

Array.apply(null, Array(10)).map(function() { return Math.floor(Math.random() * 100 % 100); })

[ 86, 77, 83, 27, 79, 96, 67, 75, 52, 21 ]

Un tableau aléatoire dates (à partir de 10 ans à ans à aujourd'hui)

Array.apply(null, Array(10)).map(function() { return new Date((new Date()).getFullYear() - Math.floor(Math.random() * 10), Math.floor(Math.random() * 12), Math.floor(Math.random() * 29) )})

[ 2008-08-22T21: 00: 00.000 Z, 2007-07-17T21:00: 00.000 Z,

2015-05-05T21:00: 00.000 Z, 2011-06-14T21:00: 00.000 Z,

2009-07-23T21:00: 00.000 Z, 2009-11-13T22: 00: 00.000 Z,

2010-05-09T21:00: 00.000 Z, 2008-01-05T22:00: 00.000 Z,

2016-05-06T21:00: 00.000 Z, 2014-08-06T21:00: 00.000 Z]

Un tableau (longueur 10) des chaînes aléatoires

Array.apply(null, Array(10)).map(function() { return Array.apply(null, Array(Math.floor(Math.random() * 10  + 3))).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); }).join('') });

['cubjjhaph', "bmwy", "alhobd", "ceud", "tnyullyn", "vpkdflarhnf", "hvg", "arazuln", "jzz", 'cyx']

autres choses utiles que vous pouvez trouver ici https://github.com/setivolkylany/nodejs-utils/blob/master/utils/faker.js

2
répondu Seti Volkylany 2016-12-30 11:56:56

en utilisant de nouvelles fonctionnalités ES6, cela peut maintenant être réalisé en utilisant:

function getRandomInt(min, max) {
    "use strict";
    if (max < min) {
        // Swap min and max
        [min, max] = [min, max];
    }

    // Generate random number n, where min <= n <= max
    let range = max - min + 1;
    return Math.floor(Math.random() * range) + min;
}

let values = Array.from({length: 40}, () => getRandomInt(0, 40));

console.log(values);

notez que cette solution ne fonctionnera que dans les navigateurs modernes qui prennent en charge ces fonctionnalités ES6: arrow functions et Array.de.)(

1
répondu Lachlan Hunt 2015-06-21 10:33:47

de la page suggérée par @Phrogz

for (var i=0,nums=[];i<49;i++) nums[i]={ n:i, rand:Math.random() };
nums.sort( function(a,b){ a=a.rand; b=b.rand; return a<b?-1:a>b?1:0 } );
0
répondu Luis Siquot 2011-04-29 20:17:43

j'avais besoin de quelque chose d'un peu différent de ce que ces solutions donnaient, en ce que j'avais besoin de créer un tableau avec un nombre de nombres aléatoires distincts tenus à une plage spécifiée. Ci-dessous est ma solution.

function getDistinctRandomIntForArray(array, range){
   var n = Math.floor((Math.random() * range));
   if(array.indexOf(n) == -1){        
    return n; 
   } else {
    return getDistinctRandomIntForArray(array, range); 
   }
}

function generateArrayOfRandomInts(count, range) {
   var array = []; 
   for (i=0; i<count; ++i){
    array[i] = getDistinctRandomIntForArray(array, range);
   };
   return array; 
}

j'aurais préféré ne pas créer une boucle qui a la possibilité de faire beaucoup d'appels inutiles (si votre compte, et la gamme est élevé et à peu près le même nombre), mais c'est le mieux que je pouvais venir.

0
répondu Joe 2013-01-20 00:08:49
function shuffle(maxElements) {
    //create ordered array : 0,1,2,3..maxElements
    for (var temArr = [], i = 0; i < maxElements; i++) {
        temArr[i] = i;
    }

    for (var finalArr = [maxElements], i = 0; i < maxElements; i++) {
        //remove rundom element form the temArr and push it into finalArrr
        finalArr[i] = temArr.splice(Math.floor(Math.random() * (maxElements - i)), 1)[0];
    }

    return finalArr
}

je suppose que cette méthode va résoudre le problème avec les probabilités, seulement limité par générateur de nombres aléatoires.

0
répondu Peter Pshenichny 2015-06-14 20:44:23

let randomNumber = Array.from({length: 6}, () => Math.floor(Math.random() * 39));

limited le tableau 6 valeurs pour le rendre facile à voir.

0
répondu Rafael 2018-09-14 08:20:23

si vous en avez besoin avec des valeurs uniques aléatoires de 0...gamme de longueurs:

const randomRange = length => {
  const results = []
  const possibleValues = Array.from({ length }, (value, i) => i)

  for (let i = 0; i < length; i += 1) {
    const possibleValuesRange = length - (length - possibleValues.length)
    const randomNumber = Math.floor(Math.random() * possibleValuesRange)
    const normalizedRandomNumber = randomNumber !== possibleValuesRange ? randomNumber : possibleValuesRange

    const [nextNumber] = possibleValues.splice(normalizedRandomNumber, 1)

    results.push(nextNumber)
  }

  return results
}

randomRange(5) // [3, 0, 1, 4, 2]
0
répondu ideallifegenerator 2018-09-25 19:32:45