JavaScript: comment arrêter un nombre aléatoire d'apparaître deux fois

Comment pouvez-vous, lors de l'utilisation d'un générateur de nombres aléatoire, arrêter l'apparition d'un numéro s'il est déjà apparu une fois?

Voici le code actuel:

var random = Math.ceil(Math.random() * 24); 

Mais les chiffres apparaissent plus d'une fois.

Vous pouvez utiliser un éventail de valeurs possibles (je pense que dans votre cas il sera de 24):

 var values = []; for (var i = 1; i <= 24; ++i){ values.push(i); } 

Lorsque vous souhaitez choisir un nombre aléatoire, il vous suffit de faire:

 var random = values.splice(Math.random()*values.length,1)[0]; 

Si vous savez combien de chiffres vous voulez, alors c'est facile, créez d'abord un tableau:

 var arr = []; for (var i = 0; i <= 24; i++) arr.push(i); 

Ensuite, vous pouvez le mélanger avec cette petite fonction:

 function shuffle(arr) { return arr.map(function(val, i) { return [Math.random(), i]; }).sort().map(function(val) { return val[1]; }); } 

Et utilisez-le de la sorte:

 console.log(shuffle(arr)); //=> [2,10,15..] random array from 0 to 24 

Vous pouvez toujours utiliser une table de hachage et avant d'utiliser le nouveau numéro, vérifiez s'il existe ou non. Cela fonctionnerait pour de plus grands nombres. Maintenant pour 24, vous pouvez toujours mélanger un tableau.

Vous pouvez mettre les nombres que vous générez dans un tableau et ensuite vérifier contre cela. Si la valeur est trouvée, essayez à nouveau:

 var RandomNumber = (function() { // Store used numbers here. var _used = []; return { get: function() { var random = Math.ceil(Math.random() * 24); for(var i = 0; i < _used.length; i++) { if(_used[i] === random) { // Do something here to prevent stack overflow occuring. // For example, you could just reset the _used list when you // hit a length of 24, or return something representing that. return this.get(); } } _used.push(random); return random; } } })(); 

Vous pouvez tester la possibilité d'obtenir toutes les valeurs uniques de la manière suivante:

 for(var i = 0; i < 24; i++) { console.log( RandomNumber.get() ); } 

Le seul problème actuellement est que vous obtiendrez une erreur de débordement de pile si vous essayez d'obtenir un nombre aléatoire plus de fois que le nombre de numéros possibles que vous pouvez obtenir (dans ce cas 24).