00110111011010101110
Résolu/Fermé
zombira
Messages postés
11
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
20 juin 2010
-
15 déc. 2009 à 01:19
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 17 déc. 2009 à 00:35
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 17 déc. 2009 à 00:35
8 réponses
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
15 déc. 2009 à 01:29
15 déc. 2009 à 01:29
en C il y a la fonction rand() qui génère des nombres pseudo aléatoires entiers entre 0 et RAND_MAX (constante qui dépend de ton compilateur, mais garantie d'être plus grande que 32000 et des poussières.
Ensuite, tu n'as qu'à faire
i = rand() % 2
pour avoir un nombre entre 0 et 1, "aléatoire" dans le sens où l'algorithme qui génère ces nombres est un algorithme qui produit des nombres qui semblent ne pas suivre de régularité apparente, et qui satisfont certaines propriétés au niveau de plusieurs tests standard statistiques (moyenne et écart-type par exemple) .
Si tu veux en savoir plus sur les nombres pseudo-aléatoires, tu trouveras beaucoup d'infos à ce sujet en faisant une simple recherche google. Je peux te garantir qu'à moins que tu fasses des maths et/ou de la physique très poussée où le modèle de nombres aléatoire est crucial, cette solution est parfaitement satisfaisante.
Par contre, il faut faire attention lorsqu'on utilise rand() de faire un srand(time(NULL)) au début du programme afin de ne pas générer les mêmes nombres à chaque exécution du programme.
Ex. ici :http://www.cplusplus.com/reference/cstdlib/rand/
Ensuite, tu n'as qu'à faire
i = rand() % 2
pour avoir un nombre entre 0 et 1, "aléatoire" dans le sens où l'algorithme qui génère ces nombres est un algorithme qui produit des nombres qui semblent ne pas suivre de régularité apparente, et qui satisfont certaines propriétés au niveau de plusieurs tests standard statistiques (moyenne et écart-type par exemple) .
Si tu veux en savoir plus sur les nombres pseudo-aléatoires, tu trouveras beaucoup d'infos à ce sujet en faisant une simple recherche google. Je peux te garantir qu'à moins que tu fasses des maths et/ou de la physique très poussée où le modèle de nombres aléatoire est crucial, cette solution est parfaitement satisfaisante.
Par contre, il faut faire attention lorsqu'on utilise rand() de faire un srand(time(NULL)) au début du programme afin de ne pas générer les mêmes nombres à chaque exécution du programme.
Ex. ici :http://www.cplusplus.com/reference/cstdlib/rand/
UgglyBoy
Messages postés
422
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
30 mai 2015
64
15 déc. 2009 à 01:38
15 déc. 2009 à 01:38
rand()est la fonction qui renvoie une valeur entre 0 et 1.
avec des
if (i>0.5)et des
elsetu arrondira à l'entier
mais de toutes façons: que veux tu faire avec ta chaîne de 0100101010 ?
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
15 déc. 2009 à 01:43
15 déc. 2009 à 01:43
non, voir le lien que j'ai donné :
int rand ( void );
Generate random number
Returns a pseudo-random integral number in the range 0 to RAND_MAX.
int rand ( void );
Generate random number
Returns a pseudo-random integral number in the range 0 to RAND_MAX.
UgglyBoy
Messages postés
422
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
30 mai 2015
64
15 déc. 2009 à 01:51
15 déc. 2009 à 01:51
@pacorabanix: c'est juste. j'ignorais l'existance de la constante RAND_MAX. Et évidement si ça génère des entiers alors un modulo s'impose.
zombira
Messages postés
11
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
20 juin 2010
15 déc. 2009 à 23:33
15 déc. 2009 à 23:33
merci bien à vous une petite précision que j'aimerais avoir pour être sur de bien comprendre:
en fesant un %2 je vais avoir la parti décimale d'une division par deux arrondi au entier ( donc soit 1 soit 0 ) ?
ps. ce code me semble corecte mais pour tant il est bourré d'erreur pouvez vous me dir si je suis sur la bonne piste:
#include <stdio.h>
int main()
{
int i = NULL ;
int boucle= 1 ;
for (boucle= 1) ;
{
i = rand()%2 ;
printf ("%d", i ) ;
}
return 0;
}
en fesant un %2 je vais avoir la parti décimale d'une division par deux arrondi au entier ( donc soit 1 soit 0 ) ?
ps. ce code me semble corecte mais pour tant il est bourré d'erreur pouvez vous me dir si je suis sur la bonne piste:
#include <stdio.h>
int main()
{
int i = NULL ;
int boucle= 1 ;
for (boucle= 1) ;
{
i = rand()%2 ;
printf ("%d", i ) ;
}
return 0;
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
16 déc. 2009 à 00:31
16 déc. 2009 à 00:31
en fesant un %2 je vais avoir la parti décimale d'une division par deux arrondi au entier ( donc soit 1 soit 0 ) ?
oui tout à fait, sauf qu'on appelle ça le reste, pas la partie décimale.
ps. ce code me semble corecte mais pour tant il est bourré d'erreur pouvez vous me dir si je suis sur la bonne piste:
alors s'il te semble correct c'est que tu ne connais pas bien la syntaxe du c. Je vois deux grosses erreurs qui devraient te sauter aux yeux.
Pour faire "pédagogique", je te conseille de regarder quelle les erreurs que te donne ton compilateur, pour que tu apprennes à comprendre ce qu'il te dit (car tu auras souvent des erreurs de compilation, crois-moi :) )
Si tu ne les comprends pas copie-les ici et dis-nous lesquelles te posent problème.
BloodyAngel
Messages postés
1482
Date d'inscription
mardi 21 juin 2005
Statut
Contributeur
Dernière intervention
21 juin 2018
402
16 déc. 2009 à 00:58
16 déc. 2009 à 00:58
<Message supprimé>
zombira
Messages postés
11
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
20 juin 2010
16 déc. 2009 à 01:05
16 déc. 2009 à 01:05
en effet je ne connais pas très bien ;a syntaxe du c et c'est justement pour me pratiquer un peu que je fait ça.
-------------- Build: Debug in calcul infini ---------------
Compiling: main.c
/home/mzombira/code source/C/calcul infini/main.c: In function ‘main’:
/home/mzombira/code source/C/calcul infini/main.c:5: warning: initialization makes integer from pointer without a cast
/home/mzombira/code source/C/calcul infini/main.c:7: error: expected ‘;’ before ‘)’ token
/home/mzombira/code source/C/calcul infini/main.c:7: error: expected expression before ‘)’ token
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 1 warnings
ce sont les erreur que mon codebloque me donne et je ne vois pas vraiment ou je me suis trompé au niveau des ; ou des ) et que je les enlève ou les mettent les erreur reste les même donc je suis un peut perdu ^^
j'aimerais bien connaitre les deux grosse erreur que je ne voit pas.
et merci de m'aider !
-------------- Build: Debug in calcul infini ---------------
Compiling: main.c
/home/mzombira/code source/C/calcul infini/main.c: In function ‘main’:
/home/mzombira/code source/C/calcul infini/main.c:5: warning: initialization makes integer from pointer without a cast
/home/mzombira/code source/C/calcul infini/main.c:7: error: expected ‘;’ before ‘)’ token
/home/mzombira/code source/C/calcul infini/main.c:7: error: expected expression before ‘)’ token
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 1 warnings
ce sont les erreur que mon codebloque me donne et je ne vois pas vraiment ou je me suis trompé au niveau des ; ou des ) et que je les enlève ou les mettent les erreur reste les même donc je suis un peut perdu ^^
j'aimerais bien connaitre les deux grosse erreur que je ne voit pas.
et merci de m'aider !
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
16 déc. 2009 à 02:26
16 déc. 2009 à 02:26
alors tout d'abord le premier problème : ce warning :
(ce n'est pas une "erreur" puisque ça compile, d'ailleurs il me semble que tout va marcher comme tu le penses à ce niveau, mais je pense que c'est important :) )
La ligne 5 c'est
ce sont les pointeurs qui peuvent être "NULL". Je pense que tu voulais dire i = 0; . Normalement NULL est converti en 0, car en fait un pointeur est comme un nombre (une adresse). ("cast" = conversion de type de donnée pour info), mais n'empêche que c'est pas les mêmes types de données, et le compilateur râle. Il n'est pas sûr de faire ce que tu lui demandes.
ensuite, la vrai première erreur est :
la ligne 7 c'est
en effet, la syntaxe du for c'est
expected ‘;’ before ‘)’ token , il ne voit pas de ";" .
Ensuite il dit aussi expected expression before ‘)’ token , c'est encore une fois car il s'attendait à voir autre chose avant la fin des parenthèses.
typiquement on utilise le for pour les boucles avec un compteur, donc apparemment comme tu souhaites faire:
cette boucle affiche 0 1 2 3 4 5 6 7 8 9
La deuxième erreur n'est pas une erreur de syntaxe, ce n'est pas une erreur qui apparait à la compilation. C'est ce qu'on appelle "une erreur de logique", qui n'apparait même pas en "warning". Il faut faire attention à ça car lorsque ça t'arrive tu passes pas mal de temps à regarder ton code avant de la remarquer :
là c'est comme si tu avais fait :
alors que tu souhaitais faire :
il ne faut pas mettre de point virgule après le for. Soit tu mets une seule instruction (comme mon exemple plus haut) et c'est juste cette instruction qui est exécutée, soit tu mets un bloc. Mais si tu mets un point virgule tout seul, c'est considéré par le compilateur comme une instruction (vide), et donc il ne "comprend pas" que c'est le bloc après que tu veux exécuter en boucle.
(ce n'est pas une "erreur" puisque ça compile, d'ailleurs il me semble que tout va marcher comme tu le penses à ce niveau, mais je pense que c'est important :) )
5: warning: initialization makes integer from pointer without a cast
La ligne 5 c'est
int i = NULL ;
ce sont les pointeurs qui peuvent être "NULL". Je pense que tu voulais dire i = 0; . Normalement NULL est converti en 0, car en fait un pointeur est comme un nombre (une adresse). ("cast" = conversion de type de donnée pour info), mais n'empêche que c'est pas les mêmes types de données, et le compilateur râle. Il n'est pas sûr de faire ce que tu lui demandes.
ensuite, la vrai première erreur est :
7: error: expected ‘;’ before ‘)’ token
la ligne 7 c'est
for (boucle= 1) ;
en effet, la syntaxe du for c'est
for(instruction de départ; test;instruction exécutée à chaque fin de boucle)il y a donc 2 " ; " dans un for, c'est pour ça qu'il te donne ce message :
expected ‘;’ before ‘)’ token , il ne voit pas de ";" .
Ensuite il dit aussi expected expression before ‘)’ token , c'est encore une fois car il s'attendait à voir autre chose avant la fin des parenthèses.
typiquement on utilise le for pour les boucles avec un compteur, donc apparemment comme tu souhaites faire:
for ( int i=0; i<10; i++ ) printf("%d ", i);
cette boucle affiche 0 1 2 3 4 5 6 7 8 9
La deuxième erreur n'est pas une erreur de syntaxe, ce n'est pas une erreur qui apparait à la compilation. C'est ce qu'on appelle "une erreur de logique", qui n'apparait même pas en "warning". Il faut faire attention à ça car lorsque ça t'arrive tu passes pas mal de temps à regarder ton code avant de la remarquer :
là c'est comme si tu avais fait :
for (... ) { ; } // cette boucle ne fait rien, elle ne fait qu'exécuter une instruction vide " ; " plusieurs fois. // puis après le bloc suivant est exécuté, une seule fois. { i = rand()%2 ; printf ("%d", i ) ; }
alors que tu souhaitais faire :
for (... ) { i = rand()%2 ; printf ("%d", i ) ; }
il ne faut pas mettre de point virgule après le for. Soit tu mets une seule instruction (comme mon exemple plus haut) et c'est juste cette instruction qui est exécutée, soit tu mets un bloc. Mais si tu mets un point virgule tout seul, c'est considéré par le compilateur comme une instruction (vide), et donc il ne "comprend pas" que c'est le bloc après que tu veux exécuter en boucle.
zombira
Messages postés
11
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
20 juin 2010
17 déc. 2009 à 00:16
17 déc. 2009 à 00:16
merci de tes conseil grace à toi j'ai réussi à faire fonctionné mon code ^^
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nombre = 0;
int boucle= 2;
for(boucle >1; boucle++;)
{
nombre = rand()%2 ;
printf ("%d", nombre);
}
return 0;
}
ceci est totalement fonctionelle vraiment merci
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nombre = 0;
int boucle= 2;
for(boucle >1; boucle++;)
{
nombre = rand()%2 ;
printf ("%d", nombre);
}
return 0;
}
ceci est totalement fonctionelle vraiment merci
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
17 déc. 2009 à 00:35
17 déc. 2009 à 00:35
ok, super :)
n'oublie pas de mettre le sujet en "résolu" alors, bonne continuation
n'oublie pas de mettre le sujet en "résolu" alors, bonne continuation