9
votes

Nombre aléatoire mathématique sans répéter un nombre précédent

ne semble pas trouver une réponse à cela, disons que j'ai ceci: xxx

Comment puis-je le faire pour que le nombre aléatoire ne se répète pas. Par exemple, si le nombre aléatoire est 2, je ne veux pas que 2 sortez à nouveau.


6 commentaires

Ne reviens pas du tout ou seulement pour la prochaine fois?


@Gedrox pas sûr de vous suivre?


Est-ce que ça va recevoir des numéros 2> 4> 2> 4 ou vous ne le voulez pas?


@FRROX - C'est le but de cette question lol. À pas Recevoir des numéros de double. ;)


Donc, ce que vous voulez réellement, ce n'est pas un nombre aléatoire, mais une séquence de nombres dans un ordre aléatoire? C'est une chose assez différente. Tskuzzy semble avoir la bonne idée à ce sujet.


Créez simplement une piscine de nombres comme une matrice et prenez-en une sur une personne jusqu'à ce qu'elle soit vide.


10 Réponses :


-1
votes

Vous pouvez le faire. Avoir une gamme publique de clés que vous avez utilisées et vérifiez-les avec cette fonction: xxx

(fonction de: Fonction JavaScript inarray )

Alors, ce que vous pouvez faire est: xxx

Ce code sera coincé après Obtenir les sept chiffres afin que vous ayez besoin de vous assurer qu'il existe une fois que cela les a tous.


6 commentaires

Sûrement que pendant la boucle n'exécutera jamais, comme vous définissez m = null et une des conditions de boucle est m! = Null ou suis-je Manquer quelque chose?


Il y a déjà un inarray () intégré à jQuery


@Jackfranklin, désolé j'ai tapé vite, je l'ai réparé


@Stefan, prob veut des retards ... Oui Oui, j'ai oublié JQuery Inarray Il est utilisé de la même manière que dans mon exemple.


Overkill total. Tout ce dont vous avez besoin est fait = {}; et remplacez votre méthode in_array avec un simple m in terminé , et au lieu de .push () Utiliser fait [m] = 1; Je n'ai pas cependant pas révoqué, cela est toujours la seule solution de travail.


De plus que pendant avec la vérification NULL peut être réalisé beaucoup plus simple et plus court avec un en tant que et aucune initialisation du tout.



1
votes

Pourriez-vous essayer cela,

setInterval(function() {
    m = Math.floor(Math.random()*7);
    $('.foo:nth-of-type(' + m + ')').fadeIn(300);
}, 300);


1 commentaires

Nah qui ne fonctionnera pas, c'était mon erreur dans mon exemple de question désolé. C'est en fait ce que je voulais dire dans la question.



0
votes

Généralement, mon approche consiste à créer une matrice contenant toutes les valeurs possibles et à:

  1. Choisissez un nombre aléatoire
  2. Retirez l'élément choisi de la matrice li>
  3. Répétez les étapes 1 à 2 jusqu'à ce que le tableau soit vide li> ol>

    L'ensemble résultant de numéros contiendra tous vos indices sans répétition. P>

    Mieux encore mieux, peut-être quelque chose comme ceci: P>

    var numArray = [0,1,2,3,4,5,6];
    numArray.shuffle();
    


2 commentaires

Eh bien, je suis approprié coincé, je n'ai pas traité des tableaux à JQuery avant. : ~ |


Le code que vous utilisez pour appeler les fonctions JQuery est déjà JavaScript et il s'agit simplement d'une matrice JavaScript. Tu peux le faire!



11
votes

Il y a un certain nombre de façons que vous pourriez y parvenir.

solution A: Si la plage de chiffres n'est pas grande (disons moins de 10), vous pouvez simplement garder une trace des chiffres que vous avez déjà générés. Ensuite, si vous générez un duplicata, jetez-le et générez un autre numéro. P>

solution B: Pré-générer les nombres aléatoires, stockez-les dans un tableau, puis passez dans la matrice. Vous pouvez y accomplir en prenant les numéros 1,2, ..., n code> puis mélangez-les. P> xxx pré>

solution c: Gardez une trace des numéros disponibles dans un tableau. Choisissez un nombre aléatoirement. Supprimer le numéro de ladite matrice. P>

var randnums = [0,1,2,3,4,5,6];

setInterval(function() {
    var m = Math.floor(Math.random()*randnums.length);
    $('.foo:nth-of-type('+(randnums[m])+')').fadeIn(300);
    randnums = randnums.splice(m,1);
}, 300);


5 commentaires

+1. J'ai corrigé un bug apparent dans la solution B (modifié index ++ sur randorder [index ++] ); J'espère que ça va.


Merci, écrit ces choses rapidement sur place :)


Avez-vous copié la fonction shuffle () décrite dans le lien que j'ai donné? snippets.dzone.com/posts/show/849 . shuffle () n'est pas une fonction javascript standard. :)


@tskuzzy - Bang sur l'homme, merci beaucoup! Je vais faire beaucoup plus de recherches sur ces réponses plus tard. Aucun point posant et s'appuyant sur d'autres personnes, vous n'obtenez pas de comme ça. Merci!


S'il vous plaît, ne recommandez pas la solution a toujours. Il est sujet à une énorme perte de performances lorsqu'il y a peu de chiffres "non utilisés" et que vous êtes en boucle de quantité obscène de tentatives jusqu'à ce que math.random trébuche sur l'un d'entre eux.



1
votes

J'aime la réponse de Neal Bien que cela mendie pour une certaine récursive. Ici c'est à Java, vous aurez toujours l'idée générale. Notez que vous allez frapper une boucle infinie si vous retirez plus de numéros que Max, j'aurais pu résoudre cela, mais l'avez laissé comme pour la clarté.

EDIT: SAW NEAL a ajouté une boucle tandis que cela fonctionne bien. xxx


1 commentaires

Désolé, mais votre code est en Java. La question pose la question de JavaScript. Quoi qu'il en soit, +1 pour l'effort :)



3
votes

Vous semblez vouloir vouloir un nombre aléatoire non répétitif de 0 à 6, similaire à la réponse de Tskuzzy: xxx

Il retournera les chiffres 0 à 6 dans l'ordre aléatoire. Lorsque chacun a été dessiné une fois, il recommencera.


0 commentaires

0
votes

Je voudrais ajouter -

var RecordKeeper = {};

SRandom = function () {
    currTimeStamp = new Date().getTime();
    if (RecordKeeper.hasOwnProperty(currTimeStamp)) {
        RecordKeeper[currTimeStamp] = RecordKeeper[currTimeStamp] + 1;
        return currTimeStamp.toString() + RecordKeeper[currTimeStamp];
    }
    else {
        RecordKeeper[currTimeStamp] = 1;
        return currTimeStamp.toString() + RecordKeeper[currTimeStamp];
    }
}


0 commentaires

0
votes

Voici une solution simple, si un peu rudimentaire: xxx

si le numéro suivant est identique à celui du dernier moins 1, à moins que le nombre ne soit 0 (zéro) et la définir autre nombre dans votre ensemble (j'ai choisi 7, l'indice le plus élevé).

J'ai utilisé cette méthode dans la fonction de cycle, car la seule stipulation sur la sélection d'un nombre était de ne pas être identique à la dernière un.

Pas la solution la plus élégante ou techniquement douée, mais cela fonctionne :)


0 commentaires

0
votes

Utilisez des ensembles. Ils ont été introduits à la spécification en ES6. Un ensemble est une structure de données qui représente une collection de valeurs uniques, donc il ne peut pas inclure de valeurs en double forte>. J'avais besoin de 6 nombres aléatoires et non répétables allant de 1 à 49. J'ai commencé avec la création d'un ensemble plus long avec environ 30 chiffres (si les valeurs répètent que l'ensemble aura moins d'éléments), convertit le réglage sur la matrice puis en tranches de 6 premiers éléments. Peasy facile. set.length em> est par défaut indéfini em> et c'est inutile c'est pourquoi il est plus facile de le convertir en une matrice si vous avez besoin de longueur spécifique.

let randomSet = new Set();
for (let index = 0; index < 30; index++) {
        randomSet.add(Math.floor(Math.random() * 49) + 1) 
    };
let randomSetToArray = Array.from(randomSet).slice(0,6);
console.log(randomSet);
console.log(randomSetToArray);


0 commentaires

0
votes

Un moyen simple de générer une liste de nombres différents, quelle que soit la taille ou le numéro:

p>

     function randomNumber(max) {
          return Math.floor(Math.random() * max + 1);
        }
        
        const list = []
        while(list.length < 10 ){
            let nbr = randomNumber(500)
            if(!list.find(el => el === nbr)) list.push(nbr) 
        }
        
        console.log("list",list)


0 commentaires