Maison  >  Article  >  interface Web  >  Comment générer des nombres aléatoires non répétitifs en JavaScript sans récursion

Comment générer des nombres aléatoires non répétitifs en JavaScript sans récursion

Barbara Streisand
Barbara Streisandoriginal
2024-10-20 08:03:29307parcourir

How to Generate Non-Repeating Random Numbers in JavaScript without Recursion

Génération de nombres aléatoires non répétitifs en JavaScript

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 :

Permutation aléatoire

<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.

Fisher-Yates Shuffle

<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.

Générateurs

<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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn