Maison >interface Web >js tutoriel >Comment générer des nombres aléatoires non répétitifs en JavaScript sans récursion
Le but de cette tâche est de générer une séquence de nombres aléatoires dans une plage spécifiée qui ne se répètent pas. Une approche consiste à vérifier chaque numéro généré par rapport à une liste de numéros créés précédemment. Cependant, cette méthode peut conduire à une "RangeError" en raison d'une récursion excessive.
Une meilleure solution consiste à générer à l'avance une permutation aléatoire des nombres souhaités. Ceci peut être réalisé en utilisant diverses techniques :
<code class="javascript">var nums = [1,2,3,4,5,6,7,8,9,10], ranNums = [], i = nums.length, j = 0; while (i--) { j = Math.floor(Math.random() * (i+1)); ranNums.push(nums[j]); nums.splice(j,1); }</code>
Cet algorithme génère un ordre aléatoire des nombres en nombres. Si vous souhaitez restreindre la plage ou spécifier des nombres pairs, vous pouvez modifier les nombres en conséquence.
<code class="javascript">function shuffle(array) { var i = array.length, j = 0, temp; while (i--) { j = Math.floor(Math.random() * (i+1)); // swap randomly chosen element with current element temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);</code>
Le Fisher-Yates Shuffle est une alternative plus efficace au hasard méthode de permutation, car elle évite l'utilisation d'opérations de tableau coûteuses.
<code class="javascript">function* shuffle(array) { var i = array.length; while (i--) { yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0]; } }</code>
Les générateurs offrent une option encore plus dynamique. En utilisant les méthodes rendement et suivant, vous pouvez accéder aux nombres mélangés à la demande sans pré-générer la séquence entière.
Cette approche est particulièrement utile dans les cas où vous avez besoin d'un grand nombre de nombres aléatoires et que vous souhaitez éviter les gardant tous en mémoire en même temps.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!