Le rand !

Fermé
spriatez Messages postés 180 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 8 mai 2017 - Modifié par spriatez le 30/09/2015 à 19:46
spriatez Messages postés 180 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 8 mai 2017 - 6 oct. 2015 à 10:24
Bonjour,

Voilà. J'ai pour projet de faire un random entre 1 et 100.
J'ai alors trouvé https://forums.commentcamarche.net/forum/affich-68764-je-cherche-une-fonction-random-en-c-c dans le forum.

Ca fonctionne super. néanmoins, lorsqu'on iitialise, le chiffre augmente jusqu'à 100, sans redescendre.
En quelque sorte, je lance, je trouve 4,
relance : 7 (aleatoir biensure ! donc fonctionne.)
relance : 12
relance : 17
relance : 22
relance : 26

etc. Je souhaiterais que la variable redescende par moment .. au lieu de sans cesse augmenter ! :(

Je sais qu'il y a un problème de modulo et que c'est basé sur l'heure. Mais comment faire autrement ? :/

si je "-1" c'est pareil.

Voici mon code :


int attaque_joueur;

    srand(time(NULL));
    attaque_joueur = (rand() % 100) -1;   // entre 1 et 100 le rand
 printf("%i", attaque_joueur);
    return 0;



2 réponses

Utilisateur anonyme
30 sept. 2015 à 19:48
euh perso, je vois que tu réinitialise le germe qui fait l'aléatoire a chaque fois que tu lance la fonction, et c'est pas top. mieux vaut faire ton srand(time(NULL)) dans ton main ! c'est probablement pour ca que ca a cet effet la !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
30 sept. 2015 à 21:06
Bonjour,

Effectivement, 2 problèmes.
srand(...) n'est à lancé qu'une fois. Donc, il faut mettre cette instruction dans une fonction d'initialisation comme le main() mais surtout pas dans la fonction de génération d'aléa.
Ensuite, l'utilisation du modulo induit des tirages biaisées sur les bits de poids faibles. Il vaut la règle de 3.

Sinon, si ton projet est la génération aléatoire d'un nombre entre 1 et 100, tu penses vraiment que tu peux utiliser cette fonction ???

Cdlt,
0
spriatez Messages postés 180 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 8 mai 2017
30 sept. 2015 à 21:20
Mon code en entier :

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

// A>b
int main()
{
    unsigned short int attaque_joueur;

    srand(time(NULL));
    attaque_joueur = rand()%(170-80) +90;               
	// printf("%hu", attaque_joueur); // Pour afficher et tester.
    return 0;
}


Il est bien placé dans le main non ? :o le mettre au dessus de l'instruction unsigned short ?

Je ne sais trop comment faire autrement que par un rand ? :(
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
30 sept. 2015 à 21:31
Ah, tu relances ton programme autant de fois que tu as besoin de nombres aléatoires ? Ca serait bien mieux de faire une fonction "generation()" et de la mettre dans une boucle while() ou for() pour afficher plusieurs nombres aléatoires avec la même graine.
0
spriatez Messages postés 180 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 8 mai 2017
30 sept. 2015 à 21:58
Eh bien je veux faire un tour par tour. En gros lorsque j'attaque, l'ennemi attaque automatiquement avec un rand aleatoir lui aussi.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
30 sept. 2015 à 22:09
Ben dans ce cas, tu fais une boucle whille() et à chaque fois que tu appuies sur une touche, tu provoques un nouvel affichage.
Quoi qu'il en soit, si tu souhaites maintenir ta solution, il faudra soit attendre quelques secondes avant de relancer ton programme, ou alors d'utiliser autre chose que time(NULL) pour initialiser la graine.
0
spriatez Messages postés 180 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 8 mai 2017
30 sept. 2015 à 22:19
Bonne idée ! merci :)

Par contre, comment l'initialiser autrement ? j'ai chercher un peu mais je ne trouve pas vraiment comment faire autrement ?
0