Donnez vie à vos documents numériques !
 

Numéro aléatoire sans répétition

abracadabraPDF Forums PDF – Général Numéro aléatoire sans répétition

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #45968
    Rockabilly
    Participant

    Je dois randomiser 8 patients avec ou sans traitement.
    J’ai placé un bouton pour chaque patient à être randomisé.

    Le script pour le premier patient est comme suit:
    this.getField(« Number1 »).value = Math.floor(Math.random() * 8) + 1;

    Pour le deuxième patient, je voudrais que le numéro soit entre 1 et 8, mais différent du premier lorsque le bouton sera pressé.
    Par exemple, si le numéro du premier patient est 5, comment fait-on pour que les choix du deuxième bouton ne soient que de: 1, 2, 3, 4, 6, 7, 8?

Affichage de 13 réponses de 1 à 13 (sur un total de 13)
  • Auteur
    Réponses
  • #64947
    bebarth
    Maître des clés

    bonsoir,
    Voici ma proposition.

    Code:
    var laTable=[1,2,3,4,5,6,7,8];
    for (var i=1; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number. »+i).value=nb;
        laTable.splice(n, 1);
    }

    J’ai rajouté un point dans le nom des champs car c’est plus simple lorsqu’on duplique…
    @+
    :bonjour:

    #64948
    Rockabilly
    Participant

    Merci pour on aide bebarth.
    Le problème de mon formulaire est que j’ai un bouton pour chaque numéro plutôt que 1 bouton pour randomiser les 8 patients en un seul clic.
    J’ai « essayé » de modifier le code pour mettre dans chaque bouton. Donc dans le premier bouton j’ai mis le code où j’ai changé le « Number. »+i à 1:

    Code:
    var laTable=[1,2,3,4,5,6,7,8];
    for (var i=1; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.1 »).value=nb;
        laTable.splice(n, 1);
    }

    Cela fonctionne. Ensuite j’ai mis ce code dans le 2ième bouton et ça fonctionne:

    Code:
    if (this.getField(« Number.1 »).value== « 1 »)
    {
    var laTable=[2,3,4,5,6,7,8];
    for (var i=2; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.2 »).value=nb;
        laTable.splice(n, 1);
    }
    }

    if (this.getField(« Number.1 »).value== « 2 »)
    {
    var laTable=[1,3,4,5,6,7,8];
    for (var i=2; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.2 »).value=nb;
        laTable.splice(n, 1);
    }
    }

    if (this.getField(« Number.1 »).value== « 3 »)
    {
    var laTable=[1,2,4,5,6,7,8];
    for (var i=2; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.2 »).value=nb;
        laTable.splice(n, 1);
    }
    }

    if (this.getField(« Number.1 »).value== « 4 »)
    {
    var laTable=[1,2,3,5,6,7,8];
    for (var i=2; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.2 »).value=nb;
        laTable.splice(n, 1);
    }
    }

    if (this.getField(« Number.1 »).value== « 5 »)
    {
    var laTable=[1,2,3,4,6,7,8];
    for (var i=2; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.2 »).value=nb;
        laTable.splice(n, 1);
    }
    }

    if (this.getField(« Number.1 »).value== « 6 »)
    {
    var laTable=[1,2,3,4,5,7,8];
    for (var i=2; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.2 »).value=nb;
        laTable.splice(n, 1);
    }
    }

    if (this.getField(« Number.1 »).value== « 7 »)
    {
    var laTable=[1,2,3,4,5,6,8];
    for (var i=2; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.2 »).value=nb;
        laTable.splice(n, 1);
    }
    }

    if (this.getField(« Number.1 »).value== « 8 »)
    {
    var laTable=[1,2,3,4,5,6,7];
    for (var i=2; i    var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number.2 »).value=nb;
        laTable.splice(n, 1);
    }
    }

    Mais pour le 3ième bouton, il faudrait que je mette les 56 possibilités pour changer laTable, ce qui est faisable… mais le 4ième bouton sera pire et rendu au 8ième bouton, ce sera quasi impossible.

    #64949
    bebarth
    Maître des clés

    bonjour,
    Je ne pense pas que se soit la meilleure solution…
    Je ne pourrai pas regarder ce soir, mais pour comprendre :
    Il y a donc un bouton devant chaque champ. Lorsqu’on appuie sur le bouton, cela tire un nombre aléatoire de 1 à 8. Que se passe-t-il si on appuie une deuxième fois ??? Ne devrais-tu pas mettre des boutons radio ou des cases à cocher ???Y a-t-il uniquement 8 patients, ou plus et seulement 8 peuvent recevoir un numéro ???
    @+
    :bonjour:

    #64950
    Rockabilly
    Participant

    Bonjour bebarth
    En effet, il y a un bouton devant chaque champ « Number. » puisque chaque patient sera recruté un-à-un plutôt qu’en groupe.
    Lorsqu’on appuie sur le premier bouton, un nombre aléatoire entre 1 et 8 apparait (dans un champ masqué) et selon le numéro tiré, le patient sera dans le groupe avec ou sans traitement.
    Lorsque le deuxième patient est recruté (qui peut être dans 10 jours par exemple) on appuie sur le deuxième bouton et un numéro sera tiré, mais il doit être différent du premier numéro tiré. Dépendemment du numéro, le patient sera dans le groupe avec ou sans traitement.

    Une fois que le bouton est pressé, je fais disparaitre le bouton pour justement empêcher qu’on puisse le ré-appuyer.

    Il y a en effet des cases à cocher pour indiquer si le patient est dans le groupe avec ou sans traitement, mais celles-si seront cochées selon le numéro tiré.

    Il n’y a que 8 patients et chacun d’eux doit recevoir un numéro.

    Merci pour ton aide

    #64951
    bebarth
    Maître des clés

    bonjour,
    Voila ! Dans le fichier joint il y a un champ « Invisible » qui est… invisible et qui, une fois réinitialisé, est égale à « 1,2,3,4,5,6,7,8 ».
    Puis le script dans chaque bouton (qui pourrait être en script de document) :

    Code:
    var str = this.event.target.name;
    var n = str.indexOf(« . »);
    var indice = parseInt(str.substring(n+1));
    var str = this.getField(« Invisible »).value;
    try {
        var laTable = str.split(« , »);
        var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number. »+indice).value=nb;
        laTable.splice(n, 1);
        this.getField(« Invisible »).value=laTable.toString();
    } catch(e) {this.getField(« Number. »+indice).value=this.getField(« Invisible »).value}
    this.event.target.readonly=true;

    Ici, j’ai mis les boutons en lecture seule une fois que l’on a appuyé dessus, et un bouton de réinitialisation de tous les champs.
    @+
    :bonjour:

    #64952
    Merlin
    Maître des clés

    Bonjour.

    Mais pour le 3ième bouton, il faudrait que je mette les 56 possibilités pour changer laTable, ce qui est faisable… mais le 4ième bouton sera pire et rendu au 8ième bouton, ce sera quasi impossible.

    Je n’ai pas suivi la question de près, mais par-contre ça, ça pique les yeux !
    Voir : http://www.academie-francaise.fr/abreviations-des-adjectifs-numeraux
    :Smiley03:

    #64953
    Rockabilly
    Participant

    bonjour,
    Voila ! Dans le fichier joint il y a un champ « Invisible » qui est… invisible et qui, une fois réinitialisé, est égale à « 1,2,3,4,5,6,7,8 ».
    Puis le script dans chaque bouton (qui pourrait être en script de document) :

    Code:
    var str = this.event.target.name;
    var n = str.indexOf(« . »);
    var indice = parseInt(str.substring(n+1));
    var str = this.getField(« Invisible »).value;
    try {
        var laTable = str.split(« , »);
        var n=Math.floor(Math.random()*laTable.length);
        var nb=laTable[n];
        this.getField(« Number. »+indice).value=nb;
        laTable.splice(n, 1);
        this.getField(« Invisible »).value=laTable.toString();
    } catch(e) {this.getField(« Number. »+indice).value=this.getField(« Invisible »).value}
    this.event.target.readonly=true;

    Ici, j’ai mis les boutons en lecture seule une fois que l’on a appuyé dessus, et un bouton de réinitialisation de tous les champs.
    @+
    :bonjour:

    Merci bebarth, ça fonctionne à merveille.
    En fait, j’ai un bouton à côté de chaque patient pour annuler son numéro si le patient se retire et le remettre dans le champ invisible.
    J’utilise ce code pour remettre le numéro dans le champ:

    Code:
    var s1 = getField(« Number.1 »).valueAsString;
    this.getField(« Invisible »).value = this.getField(« Invisible »).value + « , » + s1;

    Cependant j’ai remarqué que le dernier numéro ne disparait jamais du champ invisible, alors si j’annule la dernière randomisation le numéro se retrouve 2 fois ou si j’annule disons le sixième patient, j’ai le dernier numéro et celui du sixième patient. Donc si je re-randomise, il est possible que 2 patients aient le même numéro.

    #64954
    Rockabilly
    Participant

    Bonjour.
    Je n’ai pas suivi la question de près, mais par-contre ça, ça pique les yeux !
    Voir : http://www.academie-francaise.fr/abreviations-des-adjectifs-numeraux
    :Smiley03:

    Ça fait trop longtemps que je n’ai pas écrit en français  :Ooops:

    #64955
    Merlin
    Maître des clés

    C’est une langue impitoyable  :Smiley08:

    #64956
    bebarth
    Maître des clés

    bonsoir,
    Pour vider le champ « Invisible », tu  modifies la fin du script :

    Code:

    } catch(e) {
        this.getField(« Number. »+indice).value=this.getField(« Invisible »).value;
        this.getField(« Invisible »).value= » »;
    }
    this.event.target.readonly=true;

    Il y a plusieurs solutions pour re-remplir ce champ, je t’en soumettrai une demain !
    @+
    :bonjour:

    #64957
    bebarth
    Maître des clés

    bonjour,
    Je t’ai fait un nouveau ficher avec lequel tu peux retirer les numéros aléatoires.
    Petit plus qui n’était pas obligatoire, je reclasse les numéro dans l’ordre dans le champ « Invisible » même si ça ne sert à rien vu qu’il l’est…
    J’ai mis les scripts en fonctions, ce qui évite de les copier/coller dans tous les champs à chaque modification. Ici il n’y a que 8 patients, mais imagine si tu veux adapter ton fichier pour 200 !!!  :geek:
    @+
    :bonjour:

    #64958
    Merlin
    Maître des clés

    :bravo:

    #64959
    Rockabilly
    Participant

    bonjour,
    Je t’ai fait un nouveau ficher avec lequel tu peux retirer les numéros aléatoires.
    Petit plus qui n’était pas obligatoire, je reclasse les numéro dans l’ordre dans le champ « Invisible » même si ça ne sert à rien vu qu’il l’est…
    J’ai mis les scripts en fonctions, ce qui évite de les copier/coller dans tous les champs à chaque modification. Ici il n’y a que 8 patients, mais imagine si tu veux adapter ton fichier pour 200 !!!  :geek:
    @+
    :bonjour:

    Merci encore pour ton aide. J’avais réussi à arriver aux mêmes résultats avec peine et misère et avec des bugs.
    Tes scripts sont plus simples et infaillibles.
    :bravo:  :bonjour:

Affichage de 13 réponses de 1 à 13 (sur un total de 13)
  • Vous devez être connecté pour répondre à ce sujet.