|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Futur Membre du Club
![]() Inscription : mars 2010 Messages : 32 ![]() |
Bonjour,
Un pro peut-il m'expliquer pq la première exécution de cette requête retourne la valeur 0,0 ? C'est seulement à la seconde exécution de la requête que j'obtiens un nombre aléatoire compris entre 0 et 1. Sur la doc DB2, ils parlent d'une seed value (qui serait en FR une valeur initiale) qu'on peut faire passer en argument. Je ne sais pas si cet argument pourrait solutionner le problème. http://publib.boulder.ibm.com/infoce...lref/frand.htm Si vous avez une solution simple et efficace, je suis preneur. Merci pour votre aide. |
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Administrateur de base de données Inscription : octobre 2006 Messages : 503 ![]() |
Bonjour
je ne sais pas si le lien sera utile, mais je l'ai trouvé au moins interessant SQL RAND Function Not So Random |
|
|
00
|
|
|
#3 | |
|
Futur Membre du Club
![]() Inscription : mars 2010 Messages : 32 ![]() |
Merci pour l'article.
J'en ai trouvé un autre tout aussi intéressant : http://www.wisdomjobs.com/e-universi...functions.html Il faut chercher après la fonction RAND() dans le texte : Citation:
Un peu plus haut, ils parlent aussi de la fonction GENERATE_UNIQUE() mais ça m'a l'air fort compliqué pour pas grand chose. Bref je pense que je vais placer l'heure courante avec les micro-secondes dans le seed de la fonction RAND. Je ne vois pas trop ce que je peux faire d'autre. |
|
|
|
00
|
|
|
#4 | ||
|
Futur Membre du Club
![]() Inscription : mars 2010 Messages : 32 ![]() |
Je n'aime pas du tout cette solution, mais quand il faut bricoler et qu'on ne s'appelle pas Mc Guyver :
Code :
|
||
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 641 ![]() |
vu que le 1er rand() est toujours identique et que pour un même chiffre la fonction rand() renvoie toujours le même résultat, le problème se mort la queue là non?
l'idée du timestamp était assez bonne je trouve. |
|
|
00
|
|
|
#6 |
|
Membre chevronné
![]() Administrateur de base de données Inscription : octobre 2006 Messages : 503 ![]() |
Bonjour
Il est bien noté dans la doc (mainframe dans mon cas) que RAND() retourne une série pseudo aléatoire. Et que plusieurs taches peuvent retourner le même résultat. A plusieurs endroits (sites IBM, forum, ...), il est indiqué qu'en passant des MicroSecondes en paramètre de la fonction, le résultat est un beaucoup plus aléatoire. GENERATE_UNIQUE() permet de générer une valeur unique quelque soit le cas. la chaine fait 31c de long. Mais ce n'est plus un nombre aléatoire qui est fourni. La base est un timestamp compléte de trucs (sysplex, ...). |
|
|
00
|
|
|
#7 | |||||
|
Futur Membre du Club
![]() Inscription : mars 2010 Messages : 32 ![]() |
Citation:
Code :
Alors que Code :
De plus, je trouve dommage de devoir se limiter pour la valeur du SEED. Normalement on peut aller jusque 2 milliard de valeurs différentes, alors que les microsecondes limitent énormément le nombre de valeurs différentes pour le SEED. Même en ajoutant des concat (expl microsecondes + jj + mm + aaaa etc.) on restreint fort le nombre en sortie. Enfin ce n'est que mon avis ... |
|||||
|
|
00
|
|
|
#8 | ||
|
Futur Membre du Club
![]() Inscription : mars 2010 Messages : 32 ![]() |
Je pense que le seed est plus là pour pouvoir lancer plusieurs fois la même requête et récupérer à nouveau le même résultat.
Code :
|
||
|
|
00
|
|
|
#9 |
|
Membre chevronné
![]() Administrateur de base de données Inscription : octobre 2006 Messages : 503 ![]() |
tu as re-découvert ce qui se peut se passer quand on parle de nombres "pseudo aléatoires".
|
|
|
00
|
|
|
#10 | ||
|
Futur Membre du Club
![]() Inscription : mars 2010 Messages : 32 ![]() |
Voici finalement le code que j'ai utilisé et dont je vous fait part, ça permet de générer une chaîne aléatoire avec les caractères que l'on veut. La longueur de cette chaîne est aussi "paramétrable". Je me sers du TIMESTAMP comme argument pour la fonction RAND().
Si qqn a une idée pour retirer le '20' à côté de mon commentaire "Modifier ce paramètre (2/2) si la clé générée doit avoir une autre longueur", je suis preneur. J'ai essayé d'utiliser des cast en tout genre, d'utiliser un CHAR etc. sans succès. Ca permettrait de simplifier légèrement la paramétrisation, mais ça me convient déjà très bien comme ça Code :
|
||
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Patrick Inscription : mai 2008 Messages : 821 ![]() |
Bravo, belle démonstration de récursivité.
Par contre, une petite question me taraude. Pourquoi ne pas avoir fait tout simplement une fonction ? |
|
|
00
|
|
|
#12 |
|
Futur Membre du Club
![]() Inscription : mars 2010 Messages : 32 ![]() |
Simplement pcq là où je travaille je n'ai pas la main sur toutes les parties du SGBD. Si je veux créer des fonctions etc je dois passer par d'autres équipes. Je me vois mal créer ma fonction, demander de me l'"encoder", voir que ça ne va pas, debuguer à l'aveugle et renvoyer mes demandes jusqu'à ce que ça marche. Je préfère aussi que les autres développeurs voient la fonction directement dans le code et ne pas avoir des parties "cachées".
C'est bizarre comme raisonnement je sais, mais c'est comme ça Et avec tout ça, je dois aussi dire que je ne connais pas trop cette partie de DB2, et idem avec le PL/SQL sous Oracle même si je me doute que cela apporte de nombreuses fonctionnalités. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com