web-dev-qa-db-fra.com

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? Like

[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 je reçois est très peu aléatoire. Il génère beaucoup de blocs de nombres successifs ...

47
Alexandra

Voici une solution qui mélange une liste de uniques nombres (sans 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 souhaitez autoriser des valeurs répétées (ce qui n'est pas ce que l'OP voulait), cherchez ailleurs. :)

33
Phrogz

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));

Prendre plaisir!

84
simonbor

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
Eugene Kulabuhov

Une approche ES6 encore plus courte:

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

En outre, vous pourriez avoir une fonction avec des arguments:

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

Math.random() renverra un nombre compris entre 0 et 1 (exclusif). Donc, si vous voulez 0-40, vous pouvez le multiplier par 40, le résultat le plus élevé que vous puissiez obtenir est ce que vous multipliez.

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/

14
Robert

.. le tableau que je reçois est très peu aléatoire. Il génère beaucoup de blocs de nombres successifs ...

Les séquences d'objets aléatoires contiennent souvent des blocs de nombres successifs, voir le L'erreur du joueur . Par exemple:

.. nous venons de lancer quatre têtes d'affilée .. Depuis la probabilité de une série de cinq têtes successives ne représente que 1⁄32 .. une personne soumise à la L'erreur du joueur pourrait croire que ce prochain retournement était moins susceptible de être des têtes que d'être des queues . http://en.wikipedia.org/wiki/Gamblers_fallacy

10
Jared Beck

Étant donné que la plage de nombres est limitée, la meilleure chose à faire est de générer le tableau, de le remplir avec les nombres de 0 à 39 (dans l’ordre), puis de le mélanger.

3
Pointy

Des solutions monochromes Quirk au quotidien.

Les valeurs dans les tableaux sont totales, alors quand vous utiliserez ces extraits, ils seront différents.

Un tableau (longueur 10) avec des caractères aléatoires en minuscule

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 de dates aléatoires (de 10 ans à maintenant)

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.000Z, 2007-07-17T21: 00: 00.000Z,
2015-05-05T21: 00: 00.000Z, 2011-06-14T21: 00: 00.000Z,
2009-07-23T21: 00: 00.000Z, 2009-11-13T22: 00: 00.000Z,
2010-05-09T21: 00: 00.000Z, 2008-01-05T22: 00: 00.000Z,
2016-05-06T21: 00: 00.000Z, 2014-08-06T21: 00: 00.000Z]

Un tableau (longueur 10) 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']

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

3
Seti Volkylany
var myArray = [];
var arrayMax = 40;
var limit = arrayMax + 1;
for (var i = 0; i < arrayMax; i++) {
  myArray.Push(Math.floor(Math.random()*limit));
}

Ceci est la manière traditionnelle de le faire mais j'appuie @Pointy et @Phrogz si vous voulez éviter les doublons dans votre tableau sans avoir à faire des calculs coûteux.

2
Ady Ngom

En utilisant certaines nouvelles fonctionnalités de l'ES6, ceci 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 sur les navigateurs modernes prenant en charge ces fonctionnalités ES6: les fonctions de flèche et Array.from ().

1
Lachlan Hunt

J'avais besoin de quelque chose d'un peu différent de ce que ces solutions donnaient, en ce sens que je devais créer un tableau avec un nombre de nombres aléatoires distincts compris dans une plage spécifiée. Ci-dessous 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 pouvant aboutir à de nombreux appels inutiles (si votre nombre et votre portée sont élevés et proches du même nombre), mais c'est le meilleur que je puisse trouver. 

0
Joe

Si vous en avez besoin avec des valeurs uniques aléatoires de 0 ... plage de longueur:

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
ideallifegenerator

de la page proposé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
Luis Siquot
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 résoudra le problème des probabilités, limitées uniquement par le générateur de nombres aléatoires.

0
Peter Pshenichny