Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[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
Harpo
titi wrote:

Je n'arrive pas à générer de nombres aléatoires avec random() :-(

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


Montrez le code.

--
http://patrick.davalan.free.fr/

Avatar
titi
Harpo wrote:

titi wrote:

Je n'arrive pas à générer de nombres aléatoires avec random() :-(

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


Montrez le code.



quelque chose comme ça:
ex1.c:
# include <stdio.h>
# include <stdlib.h>

main (void)
{
int rnd=random();
printf("%i",rnd);
}

Le nombre généré était toujours le même.


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

main (void)
{
time_t t=time();
int rnd=srandom(t); // ou srandom(NULL)
printf("%i",rnd);
}

Il y a une erreur.


Avatar
titi
titi wrote:

Harpo wrote:

titi wrote:

Je n'arrive pas à générer de nombres aléatoires avec random() :-(

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


Montrez le code.



quelque chose comme ça:
ex1.c:
# include <stdio.h>
# include <stdlib.h>

main (void)
{
int rnd=random();
printf("%i",rnd);
}

Le nombre généré était toujours le même.


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

main (void)
{
time_t t=time();
int rnd=srandom(t); // ou srandom(NULL)
printf("%i",rnd);
}

Il y a une erreur.



La faq:
14.9 Comment construire un générateur de nombres aléatoires ?
14.10 Comment obtenir un nombre pseudo-aléatoire dans un intervalle ?
14.11 À chaque lancement de mon programme, les nombres pseudo-aléatoires
sont toujours les mêmes ?

A quoi sert random?



Avatar
lhabert
titi :

quelque chose comme ça:
ex1.c:
# include <stdio.h>
# include <stdlib.h>

main (void)
{
int rnd=random();
printf("%i",rnd);
}

Le nombre généré était toujours le même.


C'est normal. Mais si tu fais d'autres appels à random, tu vas obtenir des
nombres différents, avec un assez longue période, c'est en ce sens que c'est
un générateur de nombres aléatoire.

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

main (void)
{
time_t t=time();
int rnd=srandom(t); // ou srandom(NULL)
printf("%i",rnd);
}

Il y a une erreur.


Pour bien faire, il faudrait que tu nous dise de quelle erreur il s'agit.
Bon, en l'occurence, c'est inutile parce que l'erreur est suffisament
basique, mais dans un cas plus compliqué, ça peut être indispensable.

Je cite le manuel :

void srandom(unsigned int seed);

Donc srandon ne renvoie pas de résultat, donc ton « int rnd=srandon(t) » n'a
pas de sens.

The srandom() function sets its argument as the seed for a new
sequence of pseudo-random integers to be returned by random().

Bref, il faut que tu fasses un « srandom(t); », et ensuite, tu peux appeller
la fonction « random ».

Avatar
Harpo
titi wrote:

ex1.c:
# include <stdio.h>
# include <stdlib.h>

main (void)
{
int rnd=random();
printf("%i",rnd);
}

Le nombre généré était toujours le même.


Oui, et c'est une excellente chose.

Il y a une erreur.


Non.

Reli le manuel.
Ce sont des nombres dont la séquence est aléatoire mais même pas
vraiment aléatoire.
C'est nécessaire que la séquence soit la même quand on veut tester
certain programmes, pour des benchmarks ou des choses comme ça.

Pour avoir un nombre imprévisible, utilise d'abord srandom() en lui
fournissant un nombre que tu peux trouver par times() ou clock() selon
ce que tu as de disponible sur ta plateforme, sous GNU/Linux tu dois
avoir times() qui doit être correct pour un usage artisanal.

--
http://patrick.davalan.free.fr/

Avatar
Hamiral
titi wrote:

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)


essaye comme ça :

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

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

return 0;
}

Perso, je ne connaissais pas random() et srandom(), mais man m'indique que
c'est du C BSD. Pour la portabilité, utilise plutôt rand() et srand(), qui
sont POSIX.

--
Hamiral

Avatar
Pierre Maurette
[...]
Reli le manuel.


Tsst tsst. S'agit-il de le relire ou de le relier, ce p..... de manuel
?

--
Pierre Maurette

Avatar
Harpo
Pierre Maurette wrote:

[...]
Reli le manuel.


Tsst tsst. S'agit-il de le relire ou de le relier, ce p..... de manuel


Et pour les mise-à-jour tu fais comment ?

--
http://patrick.davalan.free.fr/


Avatar
titi
Luc Habert wrote:

titi :

quelque chose comme ça:
ex1.c:
# include <stdio.h>
# include <stdlib.h>

main (void)
{
int rnd=random();
printf("%i",rnd);
}

Le nombre généré était toujours le même.


C'est normal. Mais si tu fais d'autres appels à random, tu vas obtenir des
nombres différents, avec un assez longue période, c'est en ce sens que
c'est un générateur de nombres aléatoire.

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

main (void)
{
time_t t=time();
int rnd=srandom(t); // ou srandom(NULL)
printf("%i",rnd);
}

Il y a une erreur.


Pour bien faire, il faudrait que tu nous dise de quelle erreur il s'agit.
Bon, en l'occurence, c'est inutile parce que l'erreur est suffisament
basique, mais dans un cas plus compliqué, ça peut être indispensable.


ex2.c: In function 'main':
ex2.c:8: warning: passing argument 1 of 'srandom' makes integer from pointer
without a cast
ex2.c:8: error: void value not ignored as it ought to be
/bin/bash: ./ex2: Aucun fichier ou répertoire de ce type


Je cite le manuel :

void srandom(unsigned int seed);

Donc srandon ne renvoie pas de résultat, donc ton « int rnd=srandon(t) »
n'a pas de sens.

The srandom() function sets its argument as the seed for a new
sequence of pseudo-random integers to be returned by random().

Bref, il faut que tu fasses un « srandom(t); », et ensuite, tu peux
appeller la fonction « random ».


J'en ai tellement à lire que je lis en diagonale! ;-)
Il y a toujours la solution dans le manuel, il suffit de la trouver...
Vous m'avez évité une lecture approfondie fastidieuse, merci à tous! :-)


Pour le plaisir:

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


main (void)
{
time_t t=time();
srandom(t);
int rnd=rand();
printf("%i",rnd);
rnd=random();
printf("%i",rnd);
}
gcc -o ex2 ex2.c;./ex2
/bin/bash: line 1: 1408 Erreur de segmentation (core dumped) ./ex2

:-) !


Avatar
lhabert
titi :

/bin/bash: line 1: 1408 Erreur de segmentation (core dumped) ./ex2


Ah oui, bien sur : la fonction « time » prend un argument, or tu n'en as pas
mis. Si tu avais inclus time.h, le compilateur t'aurait indiqué l'erreur.

1 2 3 4 5