OVH Cloud OVH Cloud

[grand débutant] nombres aléatoires

44 réponses
Avatar
titi
Je n'arrive pas à générer de nombres aléatoires avec random() :-(

time_t t=time()
srandom(t)
ne fait rien non plus

(debian)

10 réponses

1 2 3 4 5
Avatar
Hamiral
Hamiral wrote:

Harpo wrote:
Vous êtes rigolo mais téméraire.

Mon conseil, apprenez le C ou allez voir dans fr.comp.lang.basic


C'est quand même un peu rude, ça ...
Pour info, fr.comp.lang.c n'est pas réservé aux experts en C, mais aussi à
ceux qui n'y connaissent rien et veulent apprendre ...



Désolé, je prend toujours tout au premier degré :) (mais c'était quand même
un peu rude)

--
Hamiral


Avatar
titi
Hamiral wrote:

essaye comme ça :

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
srand(time(NULL));
printf("%dn", rand());

return 0;
}



Ton bout de code m'a aidé à avancer, voilà ce que j'ai fait ensuite:
(une compilation réussie est un exploit à mon niveau! ;-) )

ex2.c:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>


main (void)
{
time_t t=time(1);
srandom(t);
int rnd=rand();
printf("%i",rnd);
rnd=random();
printf("%i",rnd);
}

gcc -o ex2 ex2.c

ex2.c: In function 'main':
ex2.c:8: warning: passing argument 1 of 'time' makes pointer from integer
without a cast



ex2.c:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>


main (void)
{
time_t t=time(NULL);
srandom(t);
int rnd0=rand();
int rnd1=random();
printf("rnd0:%inrnd1:%i",rnd0,rnd1);
}

gcc -o ex2 ex2.c;./ex2

rnd0:245041075
rnd1:39158599
le shell a retourné 28

rnd0:1370453719
rnd1:409898370
le shell a retourné 30

Que signifie "28 ou "30"?



ex2.c:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>


main (void)
{
time_t t=time(NULL);
srandom(t);
int rnd0, rnd1 ,i;

i=0;

for(i;i<100;i++)
{
rnd0=rand();
rnd1=random();
printf("%it%it%in",i,rnd0,rnd1);
}
}

gcc -o ex2 ex2.c;./ex2

si //rnd0=rand(); rnd0=0
si //rnd1=random(); rnd1=-1430516640

Puis je suis passé aux tableaux.

# include <stdio.h>
# include <stdlib.h>
# include <time.h>


main (void)
{
time_t t=time(NULL);
srandom(t);
int rnd0[100], rnd1[100] ,i;


for(i=0;i<100;i++)
{
rnd0[i]=rand();
rnd1[i]=random();
printf("%it%it%in",i,rnd0[i],rnd1[i]);
}

}

~

Avatar
lhabert
titi :

main (void)


int main(int argc, char ** argv)


time_t t=time(1);
ex2.c:8: warning: passing argument 1 of 'time' makes pointer from integer
without a cast


Si tu lisais le man, un petit peu :

time_t time(time_t *t);

time() returns the time since the Epoch (00:00:00 UTC, January 1,
1970), measured in seconds.

If t is non-NULL, the return value is also stored in the memory
pointed to by t.

Avatar
Emmanuel Delahaye
Parce que vous exécutez un programme comme ça ?


Comment faut-il faire pour exécuter un programme ?


'comme ça' dans le sens de 'un tel' et non de 'de cette façon'...

C'est vrai que de lancer un programme qui comporte de tels warnings est
plutôt risqué...

--
A+

Emmanuel Delahaye


Avatar
Emmanuel Delahaye
Ton bout de code m'a aidé à avancer, voilà ce que j'ai fait ensuite:
(une compilation réussie est un exploit à mon niveau! ;-) )

ex2.c:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>


main (void)
{
time_t t=time(1);
srandom(t);
int rnd=rand();
printf("%i",rnd);
rnd=random();
printf("%i",rnd);
}

gcc -o ex2 ex2.c


On t'a pourtant indiqué comment compiler :

gcc -Wall -W[extra] -O2 -o ex2 ex2.c

ex2.c: In function 'main':
ex2.c:8: warning: passing argument 1 of 'time' makes pointer from integer
without a cast


C'est pire que ça. J'ai des fonctions inconnues...

Project : OP code
Compiler : GNU GCC Compiler (called directly)
Directory : C:devforumsOP
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c:41: warning: return type defaults to `int'
main.c: In function `main_':
main.c:42: warning: passing arg 1 of `time' makes pointer from integer
without a cast
main.c:43: error: implicit declaration of function `srandom'
main.c:43: warning: nested extern declaration of `srandom'
main.c:46: error: implicit declaration of function `random'
main.c:46: warning: nested extern declaration of `random'
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 4 warnings

ex2.c:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>


main (void)
{
time_t t=time(NULL);
srandom(t);
int rnd0=rand();
int rnd1=random();
printf("rnd0:%inrnd1:%i",rnd0,rnd1);
}


Idem : fonctions inconnues.

gcc -o ex2 ex2.c;./ex2

rnd0:245041075
rnd1:39158599
le shell a retourné 28

rnd0:1370453719
rnd1:409898370
le shell a retourné 30

Que signifie "28 ou "30"?


Ce sont les valeurs retournées par ton programme. Je rappelle que main()
retourne int (type explicite obligatoire en C99) et qu'un return
explicite est obligatoire en C90, sinon, la valeur retournée est
indéterminée (28, 30, pourquoi pas...)

Voici le code correct :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (void)
{
srand((unsigned)time(NULL));
{
int rnd0 = rand();
int rnd1 = rand();
printf("rnd0:%dn"
"rnd1:%dn", rnd0, rnd1);
}
return 0;
}

rnd0:16098
rnd1:12543

Puis je suis passé aux tableaux.


Alors on écrit le tableau, puis on le relit, sinon, il ne sert à rien...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 20

int main (void)
{
srand((unsigned)time(NULL));
{
int rnd0[N], rnd1[N] , i;

for (i = 0;i < N;i++)
{
rnd0[i] = rand();
rnd1[i] = rand();
}
for (i = 0;i < N;i++)
{
printf("%3d%8d%8dn", i, rnd0[i], rnd1[i]);
}
}
return 0;
}

0 16888 24986
1 17606 31487
2 1867 10994
3 9737 913
4 15298 10568
5 17686 4214
6 11818 260
7 16970 22503
8 13805 32181
9 1410 672
10 30695 5021
11 18826 22918
12 28022 6767
13 31705 30348
14 25040 9559
15 17531 31959
16 22938 7227
17 19022 7201
18 6326 31297
19 1905 25435

Pose des questions si tu ne comprends pas.

--
A+

Emmanuel Delahaye

Avatar
Hamiral
Luc Habert wrote:

titi :

main (void)


int main(int argc, char ** argv)


Relis la FAQ, en particulier le paragraphe 9.4



--
Hamiral


Avatar
Hamiral
titi wrote:
Que signifie "28 ou "30"?


Je ne sais pas, mais quand un programme se déroule bien, normalement on
termine la fonction main par

return 0;

pour dire que tout s'est bien passé.

Là non seulement tu déclares mal main() ; tu écris
main(void)
au lieu de
int main(void)

Mais en plus tu ne retournes rien à la fin de la fonction.

Par contre, pourquoi continues-tu à utiliser random() et srandom() alors que
nous t'avons conseillé d'utiliser rand() et srand() à la place ? Est-ce une
consigne d'exercice ?

--
Hamiral

Avatar
lhabert
Hamiral :

Luc Habert wrote:

titi :

main (void)


int main(int argc, char ** argv)


Relis la FAQ, en particulier le paragraphe 9.4


Il ne me semble pas qu'elle dise que « main (void) » soit un prototype
légal.



Avatar
titi
Hamiral wrote:

Relis la FAQ, en particulier le paragraphe 9.4

Je vais commencer par la lire (100pages!) :-)


Merci à tous de votre aide! :-)

Avatar
titi
Hamiral wrote:

titi wrote:
Que signifie "28 ou "30"?


Je ne sais pas, mais quand un programme se déroule bien, normalement on
termine la fonction main par

return 0;

pour dire que tout s'est bien passé.

Là non seulement tu déclares mal main() ; tu écris
main(void)
au lieu de
int main(void)


Je croyais que c'était facultatif.

Mais en plus tu ne retournes rien à la fin de la fonction.


Je voulais retourner le résultat de la fonction (écrit par printf) par une
variable string mais ça ne marchait pas.

Par contre, pourquoi continues-tu à utiliser random() et srandom() alors
que nous t'avons conseillé d'utiliser rand() et srand() à la place ?
Est-ce une consigne d'exercice ?



J'ai laissé les 2 pour comparer (stats). J'ai bien compris que rand() est la
bonne manière de faire.


1 2 3 4 5