Sélectionnez la valeur aléatoire NOT in array

Comment choisir une valeur aléatoire (0 à 30) qui n'est pas dans ce tableau?

var list = new Array(1,3,4,7,8,9); 

Créez le tableau complémentaire et choisissez des valeurs aléatoires à partir de celui-ci.

 var list2 = new Array(); for(var i=0; i<30; i++) if(!list.contains(i)) list2.push(i); 

Alors:

 var rand = list2[Math.floor(Math.random() * list2.length)]; 

En supposant que votre liste est de petite taille raisonnable, créez une liste de nombres qui ne sont pas dans le tableau, puis sélectionnez un nombre de ce tableau au hasard.

 function RandomValueNotInArray(array) { var e; do { e = Math.random() * 31; // n + 1 } while (array.contains(e)) return e; } 

Vous avez besoin d'une boucle while qui teste si rand est dans votre réseau restricted et, si c'est le cas, renouvelez un nouveau nombre aléatoire:

 var rand; do { rand = Math.floor(Math.random() * 31); // re-randomize, 0 to 30 inclusive } while ($.inArray(rand, restricted) > -1); return rand; 

http://jsfiddle.net/mblase75/dAN8R/

Vous ne voulez pas jQuery? Vous pouvez remplacer $.inArray(rand, restricted) par restricted.indexOf(rand) si vous utilisez ce polyfill pour les anciens navigateurs .

Je ferais probablement un tableau ou une liste liée dont je soustrayerait les éléments indésirables. De cette façon, je pourrais continuer à supprimer les éléments et à sélectionner au hasard les éléments de la position 0 à la longueur du tableau – 1 sans avoir à choisir la même chose deux fois.

Une autre façon de le faire est de randomiser un nombre entre 0 et 30 et de continuer à le faire pendant qu'il se trouve dans le tableau. Les seuls problèmes avec cela sont de savoir quand le tableau est plein (pour se débarrasser des boucles infinies) et qu'il nécessite beaucoup plus de processeur.

Vous pouvez utiliser un filtre .

 var filteredArray = list.filter(function(e){ return e!= Math.floor(Math.random() * (31)); }); 

PHP en 2 lignes:

 $result = array_diff(range(1,30), array(1,3,4,7,8,9)); echo $result[array_rand($result)];