IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

BIRT Discussion :

Génération d'une nombre aléatoire unique


Sujet :

BIRT

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut Génération d'une nombre aléatoire unique
    Bonjour,

    J'ai une table dans laquelle des noms apparaissent.
    Je peux avoir entre 10 et 16 noms. (16 lignes
    Je souhaiterais générer sur chaque ligne, dans une computed column, un nombre aléatoire allant de 1 à 12.
    J'ai réussi avec math random, mais le problème est que ce nombre doit être tirer une seule fois.
    Comment faire pour générer un nombre unique par ligne, jusqu'à 12 lignes ?

    merci pour votre aide

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 143
    Points : 1 353
    Points
    1 353
    Par défaut variable.
    Il faut utiliser une variable.

    en gros tu stockes tes tirages dans une variable et tu tires au sort parmi les autres valeurs.

    une fois tiré , tu charge la valeur dans ta variable avec setPersistentGlobalVariable ( valeur , "nomde la variable" )

    pour recupérer lors de la prochaine itération , c'est le get

    Un tableau itère tout seul sur ses lignes , donc aucun besoin de faire un cycle.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Merci pour ces éléments de réponse.
    Je ne sais par contre pas écrire le Script du Tirage.

    Ou dois-je placer le Set persistent global variable.

    Merci pour votre aide

  4. #4
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Bonjour,

    A chaque fois que tu veux tirer un numéro, tu fais appel à Math.random.
    A chaque fois que tu tires un numéro, tu dois l'ajouter à un tableau que tu mets dans une variable persistante, comme ça, si le numéro est déjà tiré, tu en cherches un autre.

    En clair, tu te crées une fonction que tu mets soit dans un fichier js (JavaScript) que tu vas lier à ton rapport, soit dans le initialize de ton rapport :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function tirageAleatoire()
    {
        var valeursAleatoires = reportContext.getPersistentGlobalVariable("valeursAleatoires");
        if (valeursAleatoires == null)
        {
            valeursAleatoires = new ArrayList();
        }
        var tirage;
        do
        {
            tirage = Math.random();
        }
        while (valeursAleatoires.contains(tirage));
        valeursAleatoires.add(tirage);
        reportContext.setPersistentGlobalVariable("valeursAleatoires", valeursAleatoires);
        return tirage;
    }
    Et tu l'appelles à la place de Math.random().

    Note : Fonction non testée, il y a sûrement des corrections à faire que tu peux poster ici pour aider les suivants.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Merci,

    Suis-je obligé d'écrire la fonction dans un fichier JS ?
    Je peux pas l'écrire directement dans BIRT ?

    D'autre part si j'ai compris il faut que je définisse la variable Tirage dans la fonction ?

    Enfin comment je fais appelle à la fonction dans ma computed column.

    Merci

  6. #6
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Citation Envoyé par jopont Voir le message
    Merci,

    Suis-je obligé d'écrire la fonction dans un fichier JS ?
    Je peux pas l'écrire directement dans BIRT ?

    D'autre part si j'ai compris il faut que je définisse la variable Tirage dans la fonction ?

    Enfin comment je fais appelle à la fonction dans ma computed column.

    Merci
    Merci de lire TOUS les mots un par un, et de réfléchir un peu à ce que tu peux faire avec ça, le forum est là pour t'aider mais nous ne sommes pas non plus là pour faire tout le travail. Il me semble que tu as déjà tous les éléments pour te débrouiller.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    J'ai réussi à mettre la fonction dans le initialize du rapport.
    Le math.random s'effectue entre 1 et 7.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    importPackage(Packages.java.util)
    function tirageAleatoire()
    {
        var valeursAleatoires = reportContext.getPersistentGlobalVariable("valeursAleatoires");
        if (valeursAleatoires == null)
        {
             valeursAleatoires = new ArrayList();
        }
        var nbre
        var tirage;
        do
        {
        	nbre = Math.random()*7+1;
            tirage = nbre;
        }
        while (valeursAleatoires.contains(tirage));
        valeursAleatoires.add(tirage);
        reportContext.setPersistentGlobalVariable("valeursAleatoires", valeursAleatoires);
        return tirage;
    }
    Ensuite je crée un dynamictext dans lequel j’écris : Math.round(tirageAleatoire())

    Les valeurs sont bien toutes différentes avec la fonction Math.random.
    Par contre avec le Math.round, je retrouve des valeurs égales.

    Comment palier à ce problème ?

    Merci

  8. #8
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Le mieux c'est d'arrondir la valeur avant de la renvoyer non ?

    Que te renvoies Math.round() ?

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Oui c'est ce que j'ai fait, mais lorsque je le fait dans la fonction, la fonction ne se réalise pas.
    Merci

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Avec ce code, en arrondissant avec math floor ou round, le preview dans BIRT ne se termine pas. Je ne sais donc pas ce que renvoie round ou floor.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    importPackage(Packages.java.util)
    importPackage(Packages.java.text)
    importPackage(Packages.java.lang)
    function tirageAleatoire()
    {
        var valeursAleatoires = reportContext.getPersistentGlobalVariable("valeursAleatoires");
        if (valeursAleatoires == null)
        {
             valeursAleatoires = new ArrayList();
        }
        var tirage;
        do
        {
            tirage = Math.floor((Math.random()*7))+1;
        }
        while (valeursAleatoires.contains(tirage));
        valeursAleatoires.add(tirage);
        reportContext.setPersistentGlobalVariable("valeursAleatoires", valeursAleatoires);
        return tirage;
    }

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    Lorsque je met ça dans la fonction, le preview dure 3 secondes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tirage = Math.floor(Math.random());
    Par contre lorsque je met ça, le preview n'aboutit jamais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tirage = Math.random();
    Quelqu'un sait-il de quoi ça peut venir, car il me manque plus que cela pour terminer.

    merci

  12. #12
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2009
    Messages
    529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2009
    Messages : 529
    Points : 836
    Points
    836
    Par défaut
    Je viens de faire un essai ça fonctionne très bien avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tirage = Math.floor((Math.random()*7))+1;
    Par contre si la fonction est appelée plus de 7 fois (donc si ta table fait plus de 7 lignes), le tableau est complet et la fonction entre dans une boucle infinie à cause du "while". Je ne comprends pas vraiment ce que tu souhaites faire, mais ajoute une condition sur la taille du tableau pour éviter la boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       do
        {
        	tirage = Math.floor((Math.random()*7))+1;
        }
        while (valeursAleatoires.contains(tirage) && valeursAleatoires.size()<7);

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Ok merci, la table fait plus de 7 lignes donc la limite dans la fonction est efficace au niveau du math floor et math random.

    En fait ce que je veux, c'est distribuer les numéros de 1 à 7 une seule fois et à une seule ligne.
    Dans le preview de l'image en pièce jointe, le 1 est distribué 3 fois ...
    Images attachées Images attachées  

  14. #14
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Parce que quand tu ne fais pas le math.floor avant de comparer et stocker le résultat, le nombre comparé et stocké est un flottant, donc 1.2 et 1.3 sont différents, mais en appliquant le floor après, tu auras 1 pour chacun. Voilà pourquoi il faut bien le penser à le mettre DANS la fonction.

    Ceci dit, donino a raison, qu'est ce que tu fais pour les lignes suivantes ?

  15. #15
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Merci pour vos réponses.

    Pour les lignes suivantes, une fois que les nombres sont distribués ?

    Comment faire pour distribuer les numéros 1,2,3,4,5,6,7 une seule fois même si j'ai plus de 7 lignes ?
    merci

  16. #16
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2009
    Messages
    529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2009
    Messages : 529
    Points : 836
    Points
    836
    Par défaut
    Citation Envoyé par jopont Voir le message
    Comment faire pour distribuer les numéros 1,2,3,4,5,6,7 une seule fois même si j'ai plus de 7 lignes ?


    Bah oui justement. Ce n'est pas une question de "comment" mais plutôt "quoi" faire pour les lignes quand tous les numéros ont déjà été distribués . Retourner null quand valeursAleatoires.size()>=7?

  17. #17
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    bonjour,

    Si j'ai en moyenne 20 lignes, je voudrais distribuer les numéros de 1 à 7 sur 7 des 20 lignes de façon aléatoire.

    Où dois-je mettre, dans le code, le renvoi de la valeur null si la taille de la variable est supérieur à 7 ?
    Merci

  18. #18
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Peut-être est-il possible de mettre dans un tableau les valeurs de 1 à 7 ?

    Ensuite, je veux distribuer ces 7 numéros de manière aléatoire sur les lignes, quelque soit le nombre de ligne. Les 7 numéros doivent être distribués une seule fois.

    Si j'ai moins de 7 lignes, par exemple 5, je voudrais que les numéros de 1 à 5 soient distribués de manière aléatoire sur les 5 lignes.

    Merci pour votre aide.

  19. #19
    Nouveau Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Je n'ai toujours pas trouvé la solution.

    avez-vous une idée ?

    merci

Discussions similaires

  1. [Tableaux] 5 nombres aléatoires uniques
    Par jiojio dans le forum Langage
    Réponses: 8
    Dernier message: 06/03/2009, 13h45
  2. Un champs de nombres aléatoires uniques qui ne se suivent pas ?
    Par muad'dib dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 09/04/2008, 13h53
  3. nombre aléatoire unique
    Par Alex35 dans le forum VB.NET
    Réponses: 20
    Dernier message: 08/01/2008, 17h22
  4. Génération de n nombres aléatoires différents
    Par progfou dans le forum Probabilités
    Réponses: 3
    Dernier message: 13/12/2005, 18h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo