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

joponta Messages postés 8 Date d'inscription lundi 27 octobre 2008 Statut Membre Dernière intervention 22 mai 2013 - 15 mai 2013 à 15:36
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 - 7 juin 2013 à 00:31
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

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 mai 2013 à 15:48
Salut,

Je déplace vers le forum javascript
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
22 mai 2013 à 17:33
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>
0
joponta Messages postés 8 Date d'inscription lundi 27 octobre 2008 Statut Membre Dernière intervention 22 mai 2013
22 mai 2013 à 18:55
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
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
22 mai 2013 à 20:53
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kitzume Messages postés 6 Date d'inscription jeudi 18 mars 2010 Statut Membre Dernière intervention 6 juin 2013
6 juin 2013 à 21:47
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
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
7 juin 2013 à 00:31
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)
0
Rejoignez-nous