BIRT : Génération d'une nombre aléatoire unique en javascript

Signaler
Messages postés
8
Date d'inscription
lundi 27 octobre 2008
Statut
Membre
Dernière intervention
22 mai 2013
-
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
-
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, un nombre aléatoire unique allant de 1 à 12.
J'ai réussi avec math random, mais le problème est que lorsque je fais un arrondi avec math.floor (ou math.round) dans la fonction, la fonction n’aboutit pas
Voici le code que je met dans initialize du rapport BIRT :
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()*11))+1;
    }
    while (valeursAleatoires.contains(tirage));
    valeursAleatoires.add(tirage);
    reportContext.setPersistentGlobalVariable("valeursAleatoires", valeursAleatoires);
    return tirage;
}


Voici le code que je met dans le dynamic text sur le layout du rapport :
tirageAleatoire()

Comment palier à ce problème ?
Merci

6 réponses

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
311
Salut,

Je déplace vers le forum javascript
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
13
Salut,
Peut être une solution :

<html>
<head>

<script type="text/javascript">
function shuffle() {
while (document.getElementById("results").hasChildNodes()) {
document.getElementById("results").removeChild(document.getElementById("results").firstChild);
}
var values = new Array();
values[0] = 0;
values[1] = 1;
values[2] = 2;
values[3] = 3;
values[4] = 4;
values[5] = 5;
values[6] = 6;
values[7] = 7;
values[8] = 8;
values[9] = 9;
values[10] = 10;
values[11] = 11;
for (i = 1; i < values.length; i++) {
j = Math.floor(Math.random() * i);
values[i] = values[j];
values[j] = i;
}

for (i = 0; i < values.length; i++) {
span = document.createElement("span");
span.innerHTML = values[i] + " ";
document.getElementById("results").appendChild(span);
}
}
</script>

</head>



Shuffle

</html>
Messages postés
8
Date d'inscription
lundi 27 octobre 2008
Statut
Membre
Dernière intervention
22 mai 2013

Bonsoir,

tout d'abord merci pour ces éléments de réponses.

Avant de préciser ma demande, faut-il écrire ton code dans un dynamic text dans BIRT ?

Je précise à présent ma demande, je souhaite distribuer de façon aléatoire les nombre de 1 à 12 et en principe le nombre de ligne varie.
J'aimerais si le nombre de lignes est par exemple de 7, distribuer les nombres de 1 à 7 de façon aléatoire ?
Si le nombre de ligne est égale à 10, je voudrais distribuer de façon aléatoire les nombres de 1 à 10.
Lorsque le nombre de ligne est supérieur à 12, je veux distribuer une seule fois les nombres de 1 à 12, le nombre de ligne restant n'a pas de chiffre attribuée.

Merci
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
13
Re,

Je ne sais pas ce qu'est BIRT.
Tu es dans la section javascript, je réponds en javascript.
L'algo que je t'ai proposé est une redistribution des cellules d'un tableau de valeurs uniques de manière aléatoire et quelque soit le nombre de cellules.
Une fois le tableau créé et la redistribution opérée dans le tableau (shuffle), tu peux parcourir le tableau dans l'ordre pour lire et affecter les valeurs redistribuées à tes lignes.

Le cœur de shuffle c'est ça (à chaque itération, un tirage aléatoire et un échange de valeurs dans les cellules) :

for (i = 1; i < values.length; i++) {
j = Math.floor(Math.random() * i);
values[i] = values[j];
values[j] = i;
}


Si tu as 7 valeur à distribuer, tu crées un tableau de 7 cellules avec leur valeur ordonnées, tu appliques shuffle et tu relis le tableau redistribué.
Pareil si tu as 10 ou n valeurs à distribuer.
Si tu veux limiter à 12, tu crées un tableau de 12 cellules.
Messages postés
6
Date d'inscription
jeudi 18 mars 2010
Statut
Membre
Dernière intervention
6 juin 2013

Bonsoir,


je suis aussi sur le même sujet, générer un nombre aléatoire unique. Je me permet de poursuivre se poste.

Le coeur du shuffle et dans le for comme dit sur le poste au dessus.
Se que je ne comprend pas de trop c'est
values[i] = values[j];
values[j] = i;

C'est quoi qui fait le le nombre se sera pas dupliqué et pourquoi ?

J'essaie de faire un nombre aléatoire unique dans un setInterval, j'essaie de comprendre comment faire avant de poser des questions ^^
Pour le moment j'y arrive par contre dans la console c'est comme au bingo sa n’arrête pas.

Cdt
Kit
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
13
Le sujet n'est pas générer un nombre aléatoire unique, ce que je ne comprend pas, mais de "générer sur chaque ligne, un nombre aléatoire unique allant de 1 à 12".
Ici on ne fait que redistribuer les valeurs d'un tableau dont les valeurs vont de 0 à n, en ne le parcourant qu'une fois. En s'assurant d'avoir une série de n valeurs uniques ("générer sur chaque ligne, un nombre aléatoire unique allant de 1 à 12"). L'astuce c'est que l'indice i qui part aussi de la valeur 0, correspond toujours à la valeur contenue dans la dernière cellule qui a été écrasée, quand on progresse dans la boucle, et que la valeur choisie au hasard, pour être redistribuée, est toujours une case au delà de celles déjà redistribuées (celles de 0 à i-1). On n'a pas non plus besoin de cellule intermédiaire pour l’échange (v[i] = v[j]; v[j] = i au lieu de tmp = v[i]; v[i] = v[j]; v|[j] = tmp)