IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Rentrer une valeur de manière aléatoire dans un tableau en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Rentrer une valeur de manière aléatoire dans un tableau en C
    Bonjour a tous !
    Je dois programmer le jeu snake, et nous serons noté sur ce projet.
    Mais il s'avère que je suis bloqué dès les premières étapes....
    Donc je vous remercie d'avance pour votre aide qui me sera bien précieuse !

    Voila ce que j'ai fais déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <stdbool.h>
     
    int Alea()
    {
    	return (rand()%(23 - 0 + 1) +1);
    }
     
    int main()
    {
    	int tableau[24][24], i, j;
      	for(i=0;i<24;i++)
    	{
    		for(j=0;j<24;j++)
    		{
    			if (((i == 0) || (j == 0)) || (i == 23) || (j == 23))
    			{
    				tableau[i][j] = 1;
    			}
    			else(tableau[i][j] = 0);
    			{
    				printf(" ");
    			}
    		}
    	}
    	int nourriture;
    	nourriture = 0;
    	while (nourriture < 1)
    	{
    		i = Alea();
    		j = Alea();
    		while (tableau[i][j] == 1)
    		{
    			i = Alea();
    			j = Alea();
    		}
    		tableau[i][j] = 2;
    		nourriture++;
    	}
     
    	for(i=0;i<24;i++)
    	{
    		for(j=0;j<24;j++)
    		{
    			if (tableau[i][j] == 0)
    			{
    				printf("  ");
    			}
    			if (tableau[i][j] == 1)
    			{
    				printf(" #");
    			}
    			if (tableau[i][j] == 2)
    			{
    				printf(" o");
    			}
    		}
    		printf(" \n");
    	}
    	return 0;
    }
    Le "o" (le 2) étant la nourriture s'affiche mais lorsque je relance le programme le "o" est au même endroit... Comment ce fais-ce ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 671
    Points
    23 671
    Par défaut
    Bonjour et bienvenue,

    C'est dû au fait que rand() génère des nombres pseudo-aléatoires, c'est-à-dire des nombres qui ont l'air d'être choisis au hasard mais qui sont en fait tirés d'une formule mathématique soigneusement équilibrée. C'est obligatoire car l'ordinateur ne sait pas faire autre chose. L'ennui, c'est que si tu remets cette fonction dans l'état initial exact où elle se trouvait la première fois que tu l'as lancée, elle va forcément te re-générer la même séquence.

    C'est pour cela que l'on utilise une « graine » (seed en anglais) qui lui sert de point de départ. On précise cette graine à l'aide de srand().

    Dans l'absolu, il faudrait que tu sauves le dernier nombre tiré à la fin de ton programme et que tu le relises au début pour pouvoir t'en servir de graine et poursuivre sa génération mais il y a plus simple : utiliser l'heure courante qui, elle, est forcément différente à chaque appel. Le plus simple est d'utiliser directement l'appel système time() au sein de l'appel : srand(time());.

    Ça marche, mais ça a l'inconvénient d'exprimer la date en secondes écoulées, si bien que tu obtiendras la même séquence si tu appelles plusieurs fois le programme dans la même seconde, ce qui est plausible si tu le lances depuis la ligne de commande et qu'il rend la main immédiatement. Si c'est un problème, regarde plutôt du côté de gettimeofday().

  3. #3
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    pour les OS qui randomizent l'adresse de main un moyen hyper simple est d'utiliser l'adresse de main. C'est le cas de tous les OS modernes je pense. Bon c'est pas hyper propre de transformer un int (*)(void) en unsigned int mais bon pour des petites applications ça peut remplacer le super classique time(NULL) avec moins d'include.

  4. #4
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Alors déjà merci pour vos réponses !

    Ou faudrait il qu je place le srand() alors ?

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Au début de ton programme, tout simplement. Tu n'as besoin de l'appeler qu'une seule fois avant ton premier appel à rand().

  6. #6
    Candidat au Club
    Homme Profil pro
    Programmation
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Alea()
    {
    	return srand(time(NULL));
    }
    euh non pardon comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int Alea()
    {
    	return srand(time(NULL));
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/01/2017, 14h23
  2. Réponses: 16
    Dernier message: 19/06/2015, 15h14
  3. Générer une série de chiffres aléatoire dans un tableau
    Par ptitdje dans le forum Général Python
    Réponses: 4
    Dernier message: 10/06/2010, 23h06
  4. Réponses: 1
    Dernier message: 09/04/2010, 18h22
  5. pb pour rentrer une valeur dans une bdd mysql
    Par gaetan.tranvouez dans le forum Requêtes
    Réponses: 25
    Dernier message: 02/06/2006, 21h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo