abracadabraPDF › Forums › PDF – Général › Numéro aléatoire sans répétition
- Ce sujet est vide.
-
CréateurSujet
-
28 novembre 2018 à 20:01 #45968RockabillyParticipant
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() * + 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? -
CréateurSujet
-
AuteurRéponses
-
28 novembre 2018 à 21:20 #64947bebarthMaître des clés
bonsoir,
Voici ma proposition.Code:var laTable=[1,2,3,4,5,6,7,8];
for (var i=1; i<=8; 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:29 novembre 2018 à 15:16 #64948RockabillyParticipantMerci 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<=8; 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<=8; 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<=8; 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<=8; 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<=8; 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<=8; 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<=8; 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<=8; 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<=8; 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.
29 novembre 2018 à 18:01 #64949bebarthMaître des clésbonjour,
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:29 novembre 2018 à 19:05 #64950RockabillyParticipantBonjour 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
30 novembre 2018 à 08:25 #64951bebarthMaître des clésbonjour,
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:30 novembre 2018 à 09:42 #64952MerlinMaître des clésBonjour.
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:4 décembre 2018 à 20:27 #64953RockabillyParticipantbonjour,
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.
4 décembre 2018 à 20:32 #64954RockabillyParticipantBonjour.
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:
4 décembre 2018 à 22:41 #64955MerlinMaître des clésC’est une langue impitoyable :Smiley08:
4 décembre 2018 à 23:09 #64956bebarthMaître des clésbonsoir,
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:5 décembre 2018 à 14:16 #64957bebarthMaître des clésbonjour,
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:5 décembre 2018 à 15:28 #64958MerlinMaître des clés:bravo:
6 décembre 2018 à 14:44 #64959RockabillyParticipantbonjour,
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: -
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.