Partage
  • Partager sur Facebook
  • Partager sur Twitter

srand(time(NULL)); nombreMystere = (rand() %

Sujet résolu
14 juin 2013 à 11:44:13

Bonjour,

Je n'arrive pas à comprendre mot à mot la signification de ceci :

 srand(time(NULL));
    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

Le code source en entier la voici :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main ( int argc, char** argv )
{
    int nombreMystere = 0, nombreEntre = 0;
    const int MAX = 100, MIN = 1;
 
    // Génération du nombre aléatoire
 
    srand(time(NULL));
    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
 
    /* La boucle du programme. Elle se répète tant que l'utilisateur n'a pas trouvé le nombre mystère */
 
    do
    {
        // On demande le nombre
        printf("Quel est le nombre ? ");
        scanf("%d", &nombreEntre);
 
        // On compare le nombre entré avec le nombre mystère
 
        if (nombreMystere > nombreEntre)
            printf("C'est plus !\n\n");
        else if (nombreMystere < nombreEntre)
            printf("C'est moins !\n\n");
        else
            printf ("Bravo, vous avez trouve le nombre mystere !!!\n\n");
    } while (nombreEntre != nombreMystere);




  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
14 juin 2013 à 12:05:18

srand(time(NULL)) initialise la fonction srand sur le temps actuel.

rand() te retourne un nombre aléatoire comprit entre 0 et RAND_MAX ( généralement égale à 32767) en fonction de la valeur de srand et du temps actuel => temps ecoulé.

(MAX - MIN + 1) Te donne la différence entre ton maximum et ton minimum, + 1 pour inclure ton maximum.

rand() % (MAX - MIN + 1) te retourner un nombre entre 0 et (MAX - MIN + 1).

et pour finir tu ajoute MIN pour te retrouver dans l’intervalle.

exemple :

MAX = 5, MIN = 1

rand() % (5 - 1 + 1) + 1

= 7450 % (5) + 1 = 0 + 1 = 1

= 87 % (5) + 1 = 2 + 1 = 3

= 32763 % (5) + 1 = 3 + 1 = 4

Quoi qu'il arrive au finale tu obtient toujours un nombre compris entre MIN et MAX. j’espère avoir pu t'aider.

-
Edité par Anonyme 14 juin 2013 à 12:08:54

  • Partager sur Facebook
  • Partager sur Twitter
14 juin 2013 à 13:04:59

Morrio a écrit:

Bonjour,

Je n'arrive pas à comprendre mot à mot la signification de ceci :

 srand(time(NULL));
    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

La fonction time retourne le nombre secondes qui se sont écoulée depuis 1970. Ici on lui passe la valeur NULL, ce qui indique à time qu'elle n'a rien d'autre à faire.

La fonction srand initialise le générateur de nombres pseudo-aléatoire. La fonction srand prend une valeur entière positive comme paramètre. On pourrait donc écrire srand(0), ou srand(12345). Mais on obtiendrait la même suite de nombres pseudo-aléatoires à chaque exécution de notre programme. On passe donc à srand le nombre de secondes écoulées depuis 1970, ainsi on obtient une suite différente à chaque exécution de notre programme. Sauf si l'on exécute deux fois notre programme dans la même seconde, bien sûr.

rand() génère un nombre pseudo-aléatoire (entier positif) et le retourne.

L'opérateur % est l'opérateur modulo, ou reste de la division entière. En prenant le reste de rand() divisé par (MAX-MIN+1) on obtient forcément une valeur entre 0 et MAX-MIN compris. Ensuite on ajoute MIN, et l'on se retrouve donc avec une valeur entre MIN et MAX.

@beusse59 On n'initialise pas une fonction, donc on n'initialise pas srand. C'est srand qui initialise qqch.
La valeur retournée par rand ne dépend que de l'iniatialisation faite avec srand, pas du temps.
rand() % (MAX - MIN + 1) vaut un nombre entre 0 et MAX - MIN.

-
Edité par Marc Mongenet 14 juin 2013 à 13:06:49

  • Partager sur Facebook
  • Partager sur Twitter
14 juin 2013 à 18:47:21

Merci j'ai compris grâce à vous.
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2015 à 14:59:24

mon éditeur m'écrit pour cette ligne : implicit conversion changes signedness: 'time_t' (aka 'long') to 'unsigned int' .

Ce message disparaît quand je remplace time par time_t : pourquoi? J'ai pas bien compris le message...

  • Partager sur Facebook
  • Partager sur Twitter
27 août 2015 à 16:01:56

La traduction dit clairement : "Conversion implicite sans le signe de 'time_t' (aussi appelé 'long') vers 'unsigned int'."

car la fonction time retourne un 'long' et que srand() prend un paramètre un unsigned int.

La conversion est implicite en C et voulu ( donc normal). En C++, il faut caster (faire la conversion) explicitement si tu veux ne pas avoir de message.
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

28 août 2015 à 12:46:49

Attention, si sur la ligne 

srand(time(NULL));


tu remplaces le time par un time_t et que tu compiles en c++ comme ici :

srand(time_t(NULL));

tu ne fais plus du tout la même chose, dans le second cas tu crées une structure de type time_t que tu initialises à NULL (elle vaudra toujours la même chose), alors que dans le premier cas tu utilises la fonction time pour qu'elle te renvoir l'heure actuelle (elle change toutes les secondes).

Caster en time_t revient à faire cela :

srand((time_t) time(NULL));




  • Partager sur Facebook
  • Partager sur Twitter
First solve the problem. Then, write the code. ~ John Johnson
28 août 2015 à 13:37:20

Ah oui, c'est vrai : time_t(NULL) renvoit toujours 15 chez moi.

Mais la dernière ligne que tu m'envoies ne résoud pas le problème de conversion (enfin, c'est pas vraiment un problème mais si on pouvait faire disparaître ce message). Est-ce qu'il n'y a pas une fonction équivalente à time qui retourne un 'unsigned int'?

  • Partager sur Facebook
  • Partager sur Twitter
28 août 2015 à 13:42:19

Là il faut que tu regardes comment on caste en C++, il y a plusieurs types de cast …
  • Partager sur Facebook
  • Partager sur Twitter
First solve the problem. Then, write the code. ~ John Johnson
28 août 2015 à 14:15:28

Désolé dans un de mes précédents messages j'ai interverti le cast … si srand attend un unsigned int et que l'on est certain que le cast ne pose pas de problème :

srand( (unsigned int) time(NULL) );



  • Partager sur Facebook
  • Partager sur Twitter
First solve the problem. Then, write the code. ~ John Johnson
24 septembre 2015 à 23:43:27

Bonjour,

je suis débutante en C++, et j'ai un problème similaire au votre, c'est-à-dire que le message implicit conversion changes signedness: 'time_t' (aka 'long') to 'unsigned int' s'affiche.

J'ai essaye de mettre time_t, de mettre un unsigned int, mais ma valeur aléatoire ne change pas. Elle reste toujours la meme... A quoi est ce du?

  • Partager sur Facebook
  • Partager sur Twitter
26 septembre 2015 à 12:21:25

Certainent que tu appeles plusieurs fois srand ...
Mais le mieux pour avoir une réponse, c'est de créer ton propre topic en postant ton code et le message du compilateur.
  • Partager sur Facebook
  • Partager sur Twitter

🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.

26 mars 2016 à 14:27:09

mais est ce que on peut utilise <stdio.h> seulement?
  • Partager sur Facebook
  • Partager sur Twitter
27 décembre 2017 à 22:33:48

le srand(time ne se coloriste pas dans mon code il y a quoi comme probleme
  • Partager sur Facebook
  • Partager sur Twitter
27 décembre 2017 à 22:58:34

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention plus facilement.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster, demandez-vous si ce que vous allez dire apporte quelque chose au sujet. Si votre message n'apporte rien, vous ferez perdre du temps à tout le monde et le sujet pourrait dévier ou devenir difficile à suivre.

Aussi, vérifiez la date du topic. Le déterrage de topic nuit au bon fonctionnement du forum et est interdit. Utilisez les boutons pouce en haut pour dire merci. Si le topic date de plus de deux mois sans réponses, mieux vaut ne pas répondre.

Je ferme ce topic.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)