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
Bonjour,

j'aimerais pouvoir généré en C ou C++ un nombre aléatoire soit 0 ou 1 mais le fait est que je sait pas trop comment généré de nombre pseudo aléatoire ( qui vont être vraiment très pseudo si il y a que 2 choix ) et que je ne sait pas non plus comment le limité à ces deux choix. peut-être en générant mon nombre avec une variable bool ? je ne suis pas non plus sur du "est-ce possible ?".

Pour le moment j'ai réussi que ça et bah mon code fait rien je sait pas quoi y mettre après:

#include <iostream>



using namespace std;



int main()

{
bool boucle= true;

while (boucle)
{
const int MAX=1;
const int MIN=0;

}
return 0;

}


Je demande donc votre aide si vous avez une idée ou un piste pour généré le nombre ^^

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
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/
0
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
rand()
est la fonction qui renvoie une valeur entre 0 et 1.
avec des
if (i>0.5)
et des
else
tu arrondira à l'entier

mais de toutes façons: que veux tu faire avec ta chaîne de 0100101010 ?
0
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
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.
0
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
@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.
0
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
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;
}
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

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.
0
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
<Message supprimé>
0
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
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 !
0
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
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 :) )
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.
0
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
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
0
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
ok, super :)
n'oublie pas de mettre le sujet en "résolu" alors, bonne continuation
0