rand... [c] - C++ - Programmation
Marsh Posté le 15-05-2002 à 02:05:17
neogally a écrit a écrit : voila en fait je doit generer 4 chiffres compris entre 1 et 4 ( c pour un mastermind ) donc j'ai utiliser rand mais malheuresement il me renvoie tjrs la meme valeur ![]() je lui est passer la valeur de time comme param ca va bien pour le 1er chiffre mais les autre sont egaux car cela va trop vite ![]() ne rigoler pas en lisant le code de la fonction ke j'ai fait pour generer ces 4 nombre aleatoirement ( g utiliser un moyen peu recomandable , bref c immonde....lol) chui un noob en prog ( peu etre po besoin de le preciser mais g po peur du ridicule... ![]() bon help car la je cracke aidez moi a trouver une meilleure solution ![]() srand(time(NULL)); tab[0]=nb1; for(i=0;i<30000;i++){srand(time(NULL));unq2=(rand( )%4)+1;} tab[1]=nb2; for(i=0;i<47000;i++){srand(time(NULL));unq3=(rand( )%4)+1;} tab[2]=nb3; for(i=0;i<35500;i++){srand(time(NULL));unq4=(rand( )%4)+1;} tab[3]=nb4; ![]() |
Utilises la valeur retournée par ton appel a rand pour initialiser l'appel suivant.
A+,
Marsh Posté le 15-05-2002 à 09:11:26
Ca sert à quoi ça ?
Code :
|
Pourquoi tu fais un srand à chaque fois ?
Marsh Posté le 15-05-2002 à 09:48:09
DarkOli a écrit a écrit : Pourquoi tu fais un srand à chaque fois ? |
Sans doute pour réinitialiser la valeur initiale afin de ne pas avoir le même nombre à chaque fois, vu que son pb c'est que le même nombre est généré car sa boucle est trop rapide.
Tu peux éventuellement insérer dans ta boucle une autre boucle afin de temporiser :
Code :
|
ou alors générer le nb aléatoire dans une autre fonction. ça ralentira légèrement le traitement :
Code :
|
[jfdsdjhfuetppo]--Message édité par Harkonnen le 15-05-2002 à 09:49:04--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 09:52:10
merci pour les idees y'en a surtout une ki m'az parut po mal...
utiliser les premieres valeurs donne par rand pourtrouver les suivantes
merci
Marsh Posté le 15-05-2002 à 09:58:25
J'ai le même problème !!
En C, sous Unix (le randomize n'existe pas...).
Voilà le code:
tab est un tableau d'entiers.
for(l=0; l<lig; l++)
for(c=0; c<col; c++)
{
srand(time(NULL));
tab[l][c]= (int) (2.0 * rand() / RAND_MAX);
}
Le but est donc de tirer aléatoirement 0 ou 1 et de placer la valeur obtenue dans le tableau.
Malheureusement, l'exécution est tellement rapide que le nombre ne se réinitialise pas...
Si je regarde les valeurs obtenues par "rand()", j'obtiens par exemple:
rand=55942423
rand=55942423
rand=55942423
rand=55942423
rand=55942423
rand=55942423
rand=55942423
etc.
La seule solution que j'ai trouvé est de mettre un
for(i=0; i<5e7; i++);
entre chaque tirage. Sur l'ordinateur que j'utilise, cela correspond à, à peu près, une seconde.
Mais, ce n'est pas top...
[jfdsdjhfuetppo]--Message édité par El_ShAmAn___ le 15-05-2002 à 10:05:35--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 10:02:58
Y'a quand même un truc qui me chifonne sur ton source :
Tu écris ceci :
Code :
|
1 - à quoi sert unq2 ? (à moins que tu te sois planté et que tu voulais taper nb2)
2 - quel est l'intéret de calculer unq2 (ou nb2) dans une boucle de 30000 itérations, vu que tu ne l'affectes qu'une seule fois ?
Marsh Posté le 15-05-2002 à 10:06:04
la solution consiste a initialiser srand avec un nombre aléatoire , généralement j'utilise le pid de mon process ( grace a getpid() ) sous linux, qui a défaut d'être aléatoire , est impossible a predire et varie pur chaque process
Marsh Posté le 15-05-2002 à 10:10:04
flo850 a écrit a écrit : la solution consiste a initialiser srand avec un nombre aléatoire , généralement j'utilise le pid de mon process ( grace a getpid() ) sous linux, qui a défaut d'être aléatoire , est impossible a predire et varie pur chaque process |
Mais comment initialises-tu srand avec getpid() ?
Marsh Posté le 15-05-2002 à 11:06:57
El_ShAmAn___ a écrit a écrit : J'ai le même problème !! En C, sous Unix (le randomize n'existe pas...). Voilà le code: tab est un tableau d'entiers. for(l=0; l<lig; l++) for(c=0; c<col; c++) { srand(time(NULL)); tab[l][c]= (int) (2.0 * rand() / RAND_MAX); } Le but est donc de tirer aléatoirement 0 ou 1 et de placer la valeur obtenue dans le tableau. Malheureusement, l'exécution est tellement rapide que le nombre ne se réinitialise pas... Si je regarde les valeurs obtenues par "rand()", j'obtiens par exemple: rand=55942423 rand=55942423 rand=55942423 rand=55942423 rand=55942423 rand=55942423 rand=55942423 etc. La seule solution que j'ai trouvé est de mettre un for(i=0; i<5e7; i++); entre chaque tirage. Sur l'ordinateur que j'utilise, cela correspond à, à peu près, une seconde. Mais, ce n'est pas top... |
un exemple de tirage aleatoire de 0 et 1
http://www.lri.fr/~aze/page_c/aide_c/rand.html
g pas tester, mais d ordinaire ses exemples fonctionnent
edit: pourquoi srand() est dans la boucle? tu reinitialise le tirage a chaque fois?
[jfdsdjhfuetppo]--Message édité par prettysmile le 15-05-2002 à 11:14:36--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 11:34:31
prettysmile a écrit a écrit : un exemple de tirage aleatoire de 0 et 1 http://www.lri.fr/~aze/page_c/aide_c/rand.html g pas tester, mais d ordinaire ses exemples fonctionnent edit: pourquoi srand() est dans la boucle? tu reinitialise le tirage a chaque fois? |
voila effectivement cela marche mais j'arriv po a faire comprendre ces valeurs entre 1 et 4
Marsh Posté le 15-05-2002 à 11:41:24
en fait si j'ai un code de ce style ca me renvoie tjrs une meme valeur
void main(void) {
printf("%7d ", rand());
printf(" %d", (rand()%4)+1 );
}
donc il faut a chaque fois ke cela me renvoie une valeur differente
g deja utiliser le fait inclure des boucle immense pour ke cela permettre au tps de changer mais c pas propre comme code et surtout ca ne marche ke sur la machine sur laquelle on developpe
Marsh Posté le 15-05-2002 à 11:43:12
tu dois pas faire kke chose du style randomize() pour initialiser le generateur de nombre aleatoire kke part?
Marsh Posté le 15-05-2002 à 11:43:15
Harkonnen a écrit a écrit : Y'a quand même un truc qui me chifonne sur ton source : Tu écris ceci :
|
Marsh Posté le 15-05-2002 à 11:45:12
du c est tjs du c, ca change pas grand chose...
tu initialse le generateur de nombre aleatoire?
Marsh Posté le 15-05-2002 à 11:46:13
rand
Generates a pseudorandom number.
int rand( void );
Routine Required Header Compatibility
rand <stdlib.h> ANSI, Win 95, Win NT
For additional compatibility information, see Compatibility in the Introduction.
Libraries
LIBC.LIB Single thread static library, retail version
LIBCMT.LIB Multithread static library, retail version
MSVCRT.LIB Import library for MSVCRT.DLL, retail version
Return Value
rand returns a pseudorandom number, as described above. There is no error return.
Remarks
The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand.
Example
/* RAND.C: This program seeds the random-number generator
* with the time, then displays 10 random integers.
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void main( void )
{
int i;
/* Seed the random-number generator with current time so that
* the numbers will be different every time we run.
*/
srand( (unsigned)time( NULL ) );
/* Display 10 numbers. */
for( i = 0; i < 10;i++ )
printf( " %6d\n", rand() );
}
Output
6929
8026
21987
30734
20587
6699
22034
25051
7988
10104
Marsh Posté le 15-05-2002 à 11:50:33
Leirn a écrit a écrit : tu initialse le generateur de nombre aleatoire? |
ben oui.... cf son source
Code :
|
et pourquoi poster le MSDN du rand() apparemment il sait l'utiliser
son problème est que la boucle est tellement rapide que la valeur générée est à chaque fois identique, d'où les solutions proposées
Marsh Posté le 15-05-2002 à 11:54:38
oki, sorry
mais g po compris la boucle, puiskil fait rien dedans...
et je comprend po non plus pkoi il l'initialse a chak fois...
[jfdsdjhfuetppo]--Message édité par Leirn le 15-05-2002 à 11:55:20--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 11:55:39
ben moi non plus, c'est ce que je lui demande, mais il ne répond pas
Marsh Posté le 15-05-2002 à 12:32:35
Harkonnen a écrit a écrit : ben oui.... cf son source
|
Non, c'est parce qu'il reinitialise la seed a chaque fois avec srand(time(NULL)); au lieu de ne l'initialiser qu'une fois...
A+,
Marsh Posté le 15-05-2002 à 12:35:10
il repond peut etre po pcq il c po pkoi...
Marsh Posté le 15-05-2002 à 13:02:10
Leirn a écrit a écrit : il repond peut etre po pcq il c po pkoi... |
bon sorry chui po tt le tps devant mon clavier donc javais po vu vos reponse
deja je vous remercie tous car vous m'avez enormement aidez !!!
j'ai trouver la solution a mon probleme grace a vous !
je vous file mon code pour ke vous voyer ou cela plantait
void generateur()
{
int tab[4];
int i;
srand( (unsigned)time( NULL ) );
for( i = 0;i < 4;i++ )
{
tab[i]=(rand()%4)+1;
}
entrercoup(tab); // fonction de saisie de l'utilisateur
}
y'a un truc ke je ne comprend po c'est pkoi cela ne marchait pas avant car a part le cast du time(NULL) il y avait tout mais bon
voili voilou
bon sur ce merci encore @+
Marsh Posté le 15-05-2002 à 13:07:15
Ah! Ce coup ci, enfin, tu n'initialise la seed qu'une fois!
D'ailleurs, c'est exactement le probleme de El Shaman aussi.
A+,
Marsh Posté le 15-05-2002 à 13:25:31
Harkonnen a écrit a écrit : Sans doute pour réinitialiser la valeur initiale afin de ne pas avoir le même nombre à chaque fois, vu que son pb c'est que le même nombre est généré car sa boucle est trop rapide. Tu peux éventuellement insérer dans ta boucle une autre boucle afin de temporiser :
|
Oui mais comme le srand permet de selectionner une serie de nombre aleatoire en fonction du parametre il suffit de choisir une seule fois la serie aleatoire sinon si on fait plusieurs appels a srand avec le meme parametre ça selectionne a chaque fois la meme serie en se positionnant sur le premier nombre de la serie. Il faut faire un srand une seule fois tout au debut du programme et c'est tout.
Marsh Posté le 15-05-2002 à 13:34:38
J'ai mis "srand(time(NULL))" à l'extérieur de la boucle for et cela fonctionne parfaitement maintenant
Je l'avais mis à l'intérieur du "for" parce que j'avais compris que cela initialisait "rand()", donc je pensais qu'il fallait le faire avant chaque exécution du rand()...
Ce matin, j'ai écrit mon message lorsque j'étais en TP, mon prof qui est docteur en informatique n'a même pas été foutu de voir cela. Pourtant, il a essayé des syntaxes complétement connes; en mettant des parenthèses partout et en essayant aussi avec le modulo !
Enfin, je vous remercie
Mais j'ai un autre problème, maintenant, cela va très (trop) vite et dans une AUTRE fonction, je dois afficher les résultats au fur et à mesure. Il me faudrait donc une fonction qui me permette d'attendre 1 seconde (par exemple).
Marsh Posté le 15-05-2002 à 13:39:52
sleep();
A+,
Marsh Posté le 15-05-2002 à 14:59:49
gilou a écrit a écrit : sleep(); A+, |
Hum...
Je ne pense pas que cela puisse s'utiliser dans un programme (me trompe-je ?).
Marsh Posté le 15-05-2002 à 15:26:36
El_ShAmAn___ a écrit a écrit : Hum... Je ne pense pas que cela puisse s'utiliser dans un programme (me trompe-je ?). |
Ben si ça ne marche pas tu as la boucle qui sert à rien :
for (f=0;f<1000000000;f+=0.01);
Mais la durée dependera du type de machine.
Marsh Posté le 15-05-2002 à 15:27:10
DarkOli a écrit a écrit : Ben si ça ne marche pas tu as la boucle qui sert à rien : for (f=0;f<1000000000;f+=0.01); Mais la durée dependera du type de machine. |
c po bo
l'api sleep marche pas ds un prog?
Marsh Posté le 15-05-2002 à 15:28:45
El_ShAmAn___ a écrit a écrit : Hum... Je ne pense pas que cela puisse s'utiliser dans un programme (me trompe-je ?). |
Y aussi la fonction ::Sleep()
(si tu connais déjà la réponse, pourquoi demandes tu ? )
Marsh Posté le 15-05-2002 à 23:01:36
El_ShAmAn___ a écrit a écrit : Hum... Je ne pense pas que cela puisse s'utiliser dans un programme (me trompe-je ?). |
Oui, tu te trompe-je
C'est un truc unix standard en principe, sleep:
=============================================================
SLEEP(3) Linux Programmer's Manual SLEEP(3)
NAME
sleep - Sleep for the specified number of seconds
SYNOPSIS
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
DESCRIPTION
sleep() makes the current process sleep until seconds sec-
onds have elapsed or a signal arrives which is not
ignored.
RETURN VALUE
Zero if the requested time has elapsed, or the number of
seconds left to sleep.
CONFORMING TO
POSIX.1
BUGS
sleep() may be implemented using SIGALRM; mixing calls to
alarm() and sleep() is a bad idea.
Using longjmp() from a signal handler or modifying the
handling of SIGALRM while sleeping will cause undefined
results.
SEE ALSO
signal(2), alarm(2)
=============================================================
Dans ton cas, il te suffit donc d'inserer sleep(1); la ou c'est utile.
A+,
[jfdsdjhfuetppo]--Message édité par gilou le 15-05-2002 à 23:03:39--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 23:04:55
Pour les man pages unix, ce lien est pratique:
http://www.rt.com/man/
A+,
Marsh Posté le 16-05-2002 à 10:08:26
Leirn a écrit a écrit : tu dois pas faire kke chose du style randomize() pour initialiser le generateur de nombre aleatoire kke part? |
si mais randomize(); n'existe pas sous unix (ce que je ne savais pas ya 2 minutes !)
Marsh Posté le 16-05-2002 à 11:17:07
Tetragrammaton IHVH a écrit a écrit : Y aussi la fonction ::Sleep() (si tu connais déjà la réponse, pourquoi demandes tu ? ![]() |
Ben non, je ne sais pas si je demande...
En fait, sous linux, j'avais juste tapé "man sleep" et ça ne m'avais pas donné la méthode pour l'utiliser dans un programme.
Voilà, c'est tout...
Merci à ceux qui m'ont aidé
Marsh Posté le 16-05-2002 à 11:41:41
quand tu tapes man sleep, ca t'affiche sleep de man1. Quand il y a des synonimes, c'est indiqué en fin de page en général. La bonne etait dans man3. Mais pas toujours (pas dans ce cas, avec la doc GNU)
C'est pourquoi l'index http://www.rt.com/man/ qui les liste toutes est precieux.
A+,
[jfdsdjhfuetppo]--Message édité par gilou le 16-05-2002 à 11:43:39--[/jfdsdjhfuetppo]
Marsh Posté le 15-05-2002 à 01:08:07
voila en fait je doit generer 4 chiffres compris entre 1 et 4
..... chui desespere car jarriv po a trouver commen faire pour kil me renvoie un chiffre aleatoire a chaque fois !
)
( c pour un mastermind )
donc j'ai utiliser rand mais malheuresement il me renvoie tjrs la meme valeur
je lui est passer la valeur de time comme param ca va bien pour le 1er chiffre mais les autre sont egaux car cela va trop vite
ne rigoler pas en lisant le code de la fonction ke j'ai fait pour generer ces 4 nombre aleatoirement ( g utiliser un moyen peu recomandable , bref c immonde....lol)
chui un noob en prog ( peu etre po besoin de le preciser mais g po peur du ridicule...
bon help car la je cracke aidez moi a trouver une meilleure solution
srand(time(NULL));
tab[0]=nb1;
for(i=0;i<30000;i++){srand(time(NULL));unq2=(rand(
)%4)+1;}
tab[1]=nb2;
for(i=0;i<47000;i++){srand(time(NULL));unq3=(rand(
)%4)+1;}
tab[2]=nb3;
for(i=0;i<35500;i++){srand(time(NULL));unq4=(rand(
)%4)+1;}
tab[3]=nb4;