Petite question :
c´est quoi Uint ?
Je ne sais pas trop mais en SDL, je met Uint 8 keystate, c´est pour faire bouger quelqu´ue chose, mais attend une reponse plus approprié car je n´en susi pas si sur.
Uint ça veut dire unsigned int : un entier ( un int) mais non signé ( que positif de 0 à 4 milliard).
Ce n´est pas un type de base du langage. ça veut drie que quelquepart dans le programme ou dans les fichier d´en tête il y a marqué :
typedef unsigned int Uint
ou alors
Moi, j´ai fait un programme simple :
using namespace std;
int main()
{
int toi;
int autre;
srand(time(NULL));
toi = ( rand()%6)+1;
autre = ( rand()%6)+1;
cout < < " Jouons aux des ! !!" < < endl < < " Appuie sur une touche pour faire tirer un nombre a ton adversaire" < < endl;
cin.get();
cout < < " Ton adversaire a fait : " << autre < <" . " < < endl; < < " Appuie de nouveau sur une touche pour tirer un nombre"<< endl;
if ( autre == 6)
{
cout < < " Tu ne peux pas faire plus, tu as perdu..."<< endl;
}
else
{
cout < < " Appuie de nouveau sur une touche pour tirer un nombre"<< endl;
cin.get();
cout < < " Tu a fait : " << toi<< " . "<< endl;
if ( toi > autre)
{
cout < < " TU A GAGNE ! !!" < < endl;
}
else if ( toi == autre)
{
cout < < " Egalite, personne n´a gagne..." < < endl;
}
else
{
cout < < " Tu a perdu..." < < endl;
}
}
cin.get();
return 0;
}
Et quand je veux le compiler, RIEN ? Quelqu´un peut me dire pourquoi ça marche pas, plize ?
Bizarre ton programme...
Comment ça " RIEN" ? ??
Déjà enlève le . h à iostream je crois...<iostream>
Puis aussi ya une erreur, quand autre==6, tu mets qu´il a forcément perdu, mais il peut y avoir égalité.
Sois plus explicite sur ce qui se passe à la compil´...
allez hop, j´ai un créneau pour parler de la génération des nombres aléatoires alors j´en profite...
" autre = ( rand()%6)+1;"
Ca c´est super classique; c´est quelquechose qu´on lit assez souvent alors je vais me permettre d´expliquer pourquoi: " c´est MAL!"
rand dans la plupart des implémentation de la libC est fait comme un LCG ( Linear Congruential Generator).
alors qu´est ce que ca veut dire cte bete la, ca veut dire que
rand_n+1 = ( a*rand_n + b)%c
Et c´est le triplet ( a,b,c) qui fixe la " qualité" de la génération aléatoire.
On voit bien quand on donne cette formule que l´opération modulo est une opération important de la génération d´aléa. C´est pourquoi il ne faut PAS utiliser de modulo quand on fait un générateur de nombre plus petit.
( pour vous amuser fait un rand()%2 en boucle, sur la plupart des implémentations vous obtiendrez 01010101 ou 0011001100110011, des fois, on constate des périodes a 8).
Tout ca pour dire que % c´est mal.
donc, comment faire les choses proprement un nombre aléatoire entre 0 et N ? modulo dit que les nombres 0 seront les nombres du type 0+kN, les un seront 1+kN . ..
essaye de faire autrement en disant que les 0 seront entre 0 et RAND_MAX/N, les 1 entre RAND_MAX/N et 2*RAND_MAX/N . ..
et ca comment on le fait en faisant ( ((float)rand()/RAND_MAX)*N) et la on a quelquechose de " plus" aléatoire...
Sinon HappyMan, donne plus d´information sur ce qui t´arrive
Godrik dis moi, dans une autre vie tu t´appelait nesca ? ( voir le dernier post de la première page de ce topic)
Si tu essaye d´aficher en boucle des rand()%2 je te promet que tu ne verra pas de série du type 10101010 ou 11001100 comme tu le prétend tout simplement parce que ton trimplet ( a,b,c) est bien choisi. Globalement il est tellement bien choisie qu´entre 0 et RAND_MAX tout les nombres sortiront une fois avant de ressortir une nouvelle fois et ceci avec une irégularité stupéfiante ( alors qu´il est facile de retrouver ces 3 nombres à partir des sorties de la fonction.
Donc sachant que générallement RAND_MAX vaut 32000 et des poussière la différence de probabilité entre le 1 et le 6 n´excède pas 1 sur 5000. C´est à dire probablement moins que sur un vrai dès qui est toujours un peu pipé. Donc c´est vraiment enculer des mouches ( surtout qu´il vaut mieux faire float(rand()*N)/RAND_MAX que le contraire sinon tu y perd forcément.
la théorie c´est vachement bien, mais quand ça donne des gens qui t´écrive des programme en ANSI C qui ne peuvent pas se sompiler car le compilo suffisament conforme n´existe pas ça devient mauvais. Donc autant essayer son générateur de nombre aléatoire, voir qu´il fonctionne très bien avec un modulo et l´utiliser de la manière la plus simple qui soit.
" On voit bien quand on donne cette formule que l´opération modulo est une opération important de la génération d´aléa. C´est pourquoi il ne faut PAS utiliser de modulo quand on fait un générateur de nombre plus petit"
c´est ce qu´on appelle une superbe démonstration argumenté...
cin.get est pas terrible, il vaut mieux utiliser getch ( que tu trouve dans conio.h) ou system("pause"). sinon mets 2 cin.get d´affilé, un seul peut dans certain cas ne pas suffire.
Désolé pour le manque d´information, mais je devais aller au collège alors . ..
Mon programme est un petit jeu de dés très simple, sans images; L´ordinateur génère deux nombre aléatoires entre 1 et 6 qu´il met dans les variables " toi" et " autre"; Si la valeur de la variable " toi" est supérieure à la valeur de la variable " autre", l´ordinateur affiche " TU AS GAGNE", si les nombres sont égaux, ça affiche " Egalite, personne n´a gagne..." et si " autre" est supérieur à " toi", ça met " Tu as perdu...", sauf si l´adversaire fait directement 6, dans ce cas tu as perdu sans avoir tiré de nombre...
Pour les détails de la compilation, la fenêtre qui me dit s´il n´y a pas de bug dans mon prog m´annonce que tout va bien, elle se ferme . .. et c´est tout, il n´y a rien d´autre.
Merci j´ai trouvé le problème, dans la ligne :
cout < < " Ton adversaire a fait : " < < autre < <" . " < < endl; < < " Appuie de nouveau sur une touche pour tirer un nombre"<< endl;
J´avais mis un point virgule après le premier " endl", alors que la fonction n´était pas terminée ( Ah, ce que je peux être couillon
)
dnoob700, je ne suis pas aller voir le premier topic.
Je me suis gourré quand j´ai dit que c´etait un LCG qui etait implémenté dans la libC actuelle ( enfin, je parle de celle de Linux).
En effet, c´est actuellement un stub pour random ( qui utilise une politique a base de decalage de bit)
en outre, on peut lire dans man 3 rand
" If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in
j=1+(int) ( 10.0*rand()/(RAND_MAX+1.0));
and never by anything resembling
j=1+(rand() % 10);
( which uses lower-order bits)."
c´est ce qu´on appelle une superbe démonstration argumenté...
Je pourrais t´expliquer precisement pourquoi il ne faut pas le faire, mais franchement j´ai pas que ca a foutre.
si tu prend l´exemple de man 3 rand sur l´exemple de LCG, et que tu fais une etude de parité tu verra bien.
Dans mon programme , on demande d´ecrire son nom
alors je met :
using namespace std;
int main()
{
a :
char tc[129] ;
int i=0 ;
cout < < " Entre votre nom et terminer par un point " < < endl;
do
cin > > tc[i] ;
while ( tc[i++] ! =´.´);
cout < < " Vous avez entrez : " < < tc < < endl;
i=0;
do
cout < < tc[i] ;
while ( tc[i++] ! =´.´);
system("pause");
return 0;
mais quelque fois il y a un smiley ou un symbole qui est inscrit apres le nom , j´aomerais savoir pourquoi ?
Ne faite pas attention au < < a:>>
j´ai fais une erreur en recopiant
pourquoi ne pas faire cin > > tc;
?
bon sinon mets en 0 après le dernier caractère :
cin > > tc[i] ;
while ( tc[i++] ! =´.´);
tc[i]=0;
pour que lorsque tu fait cout < < tc;
il s´arrète au bon endroit.
ensuite, ton a: au début sers pas à grand chose et c´est pas très propre compte tenu que tu déclare des variables après.
excuse moi, j´ai pas fait gaffe, à ton 2eme message, je pensais que c´était un label pour un éventuel goto.
while ( tc[i++] ! =´.´);
a priori tu fais une post incrementation, je pense que tu voulais faire une preincrementation
tu devrais utiliser un for pour faire ce que tu fais la, c´est bine plus adapter.
ensuite, les chaine de caractere sont termine en C/C+ par un \0, tu pourrais l´utiliser pour faire un programme plus simple comme te l´a conseillé dnob700
darksalamandar >
Personnellement, ( c´est un avis personnel bien sur) je n´aime pas les contractions : meme quand on maitrise, des fois ça joue des sales tours.
Donc moi je serais plutot favorable, au lieu de faire :
t[c++]!=3
t[c]!=3;
c++;
Bref, encore une fois c´est un avis personnel. Faut faire gaffe aussi a ce que ça fasse la meme chose ![]()
jyy:
tu as raison, globalement les contractions: c´est mal!
De la meme facon j´ai tendance a mettre plus de {} qu´il n´en faut pour la lisibilité.
par contre, je remarque une mode par ici:
" cout < < " Vous avez entrez : " < < tc < < endl; "
celle de mettre cout < <
pour pas cout<< ?
vous trouvez ca plus lisible ? moi non perso
ah, sinon oui, j´ai trouvez ton smiley! ![]()
c´est dans la ligne que j´ai mise au dessus
< <tc<<endl;
ton tc n´est pas null terminated!
il fautrajouter a la fin de ta boucle de lecture un " tc[i] = ´\0´;"
le < < avec un espace au milieu, ça vient de jeuxvideo.com qui reformate le texte ![]()
mais sinon, évidemment qu´on préfere sans espaces ![]()
il ne le pas fait sur mon post au dessus
< < mais<< ( symbole, ou mot), mais oui, sans espace dans le code