[Java] java.util.Random pas si random que ça :(

java.util.Random pas si random que ça :( [Java] - Java - Programmation

Marsh Posté le 11-01-2005 à 20:45:49    

Hello tous,
 
j'ai un petit problème avec mes chiffres sortis avec la classe Random.
En effet, je génère des noms à partir d'une base de donnée de noms et de prénoms, je tire donc un nom et un prénom que j'assemble.
Le problème c'est que la base fait 300 prénoms * 300 noms, donc preque 100k possibilités et que j'ai déja DES couples identiques. Comme vous allez le voir dans mon code ma méthode est statique, est-ce une possible cause du problème ?
C'est la première fois que je l'etilise (Random), donc pê je fais pas les choses bien ?
Voici le code :
 

Code :
  1. /**
  2.      *Renvoie un nom généré aléatoirement parmis la base de noms et de prénoms.
  3.      */
  4.     public static String getAName() {
  5.         Connection con = null;
  6.         Statement st = null;
  7.         ResultSet rs = null;
  8.         String[] catcount = null;
  9.         Random rnd = new Random();
  10.        
  11.         try {
  12.             con = Pool.getInstance().getConnection();
  13.             //connexions et récupération du nombre d'enregistrement des             tables
  14. //noms = nombre de noms dans la base
  15. //prenoms = nombre de prénoms dans la base
  16.            
  17.             noms = rnd.nextInt(noms - 1) + 1;
  18.             prenoms = rnd.nextInt(prenoms - 1) + 1;
  19.            
  20.             if(debug)
  21.                 System.out.println(noms);
  22.             if(debug)
  23.                 System.out.println(prenoms);
  24.            
  25.             nbNoms = "SELECT * FROM NOM ORDER BY NOM";
  26.             nbPrenoms = "SELECT * FROM PRENOM ORDER BY PRENOM";
  27.            
  28. //obligé de boucler dans les resultset jusqu'au chiffre tiré aléatoirement, drivers supportent pas les resultset scrollables (absolute()...)
  29.             rs = st.executeQuery(nbPrenoms);
  30.             while(i <= prenoms && rs.next()){
  31.                 if(i == prenoms)
  32.                     nom = rs.getString(1).trim();
  33.                 i++;
  34.             }
  35.            
  36.             if(debug)
  37.                 System.out.println(nom);
  38.            
  39.             i = 0;
  40.             rs = st.executeQuery(nbNoms);
  41.             while(i <= prenoms && rs.next()){
  42.                 if(i == prenoms)
  43.                     nom += " " + rs.getString(1).trim();
  44.                 i++;
  45.             }
  46.            
  47.             return nom;
  48.            
  49.         } catch (SQLException sqle) {
  50.             //....
  51.             return null;
  52.         } finally {
  53. //....fermetures des connexions...
  54.             } catch(SQLException s) {}
  55.         }
  56.     }


une idée ?
Là je suis sur le point de tirer 100 int aléatoires, les foutre dans un tableau, et tirer aléatoirement l'index mais bon c suppra lourd pour un traîtement qui se répète en boucle assez souvent...
 
edit : oui je sais dans cette méthode mes noms de variable sont pas très heureux [:joce]


Message édité par glod 2 le 11-01-2005 à 20:53:07
Reply

Marsh Posté le 11-01-2005 à 20:45:49   

Reply

Marsh Posté le 12-01-2005 à 00:48:12    

premier up avant les soldes :o

Reply

Marsh Posté le 12-01-2005 à 01:38:14    

t'as lu la javadoc de Random? si je me souviens bien, il est expliqué noir (ou bleu?) sur blanc ce que tu dois faire.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 12-01-2005 à 09:41:21    

Tu dois instancier ton générateur à l'extérieur de la boucle !!
Car sinon, la suite est regénéré à chaque fois ! Ta fonction doit s'effectuer rapidement, donc les suites générées sont régulièrement identiques.
 
Il faut donc que ton Random soit un argument de la fonction et soit initialisé une fois avant de boucler sur ta fonction.
 
Par ailleurs, le générateur de java a mauvaise réputation mais pour ton cas, ça devrai suffire ;)


---------------
get amaroK plugin
Reply

Marsh Posté le 12-01-2005 à 09:50:14    

Glod 2 a écrit :


 Sujet : [Java] java.util.Random pas si random que ça :(


 
 
Pas si random ou pas si util ?  [:southpark1]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 12-01-2005 à 12:29:36    

bobuse a écrit :

Tu dois instancier ton générateur à l'extérieur de la boucle !!
Car sinon, la suite est regénéré à chaque fois ! Ta fonction doit s'effectuer rapidement, donc les suites générées sont régulièrement identiques.
 
Il faut donc que ton Random soit un argument de la fonction et soit initialisé une fois avant de boucler sur ta fonction.
 
Par ailleurs, le générateur de java a mauvaise réputation mais pour ton cas, ça devrai suffire ;)


ben il est pas dans une boucle mais dans une méthode là, mais je suppose que ça reviens au même, ok je vais lui passer un seed comme argument ça devrait aller mieux, m'enfin ça se mort là queue, le seed si jle mets en dur j'aurai toujours la même séquence et si j'en fais un random.... :D

Reply

Marsh Posté le 12-01-2005 à 13:20:19    

Ah ben jvais me servir du System.currentTimeMillis() pour mon seed :jap:

Reply

Marsh Posté le 12-01-2005 à 14:12:57    

Glod 2> Heu attends là :heink:  
Ta fonction, elle sert juste à récupérer au hasard un nom ? ok ?
Le truc, c'est que tu l'appelles plusieurs fois pour avoir plusieurs nom tirés au hasard ? non ?
Et ton problème et que tu as beaucoup de nom tirés qui sont les mêmes ?
 
bon, donc si je ne me suis pas trompé, ta fonction getAName() est appelée dans une boucle ?
 
Par ailleurs Java utilise déjà l'horloge comme seed je crois ;)


---------------
get amaroK plugin
Reply

Marsh Posté le 12-01-2005 à 14:22:32    

crée 1 fois ton Random avant de faire la boucle d'appels à getAName() comme le dit bobuse.
 

Reply

Marsh Posté le 13-01-2005 à 10:26:02    

SomeBugsInMe a écrit :

crée 1 fois ton Random avant de faire la boucle d'appels à getAName() comme le dit bobuse.


J'aime quand on m'écoute :sol:


---------------
get amaroK plugin
Reply

Marsh Posté le 13-01-2005 à 10:26:02   

Reply

Marsh Posté le 13-01-2005 à 20:13:28    

Vivi j'ai fait ça, je vous tiens au courant des résultats.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed