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

Turbo Pascal Discussion :

La fonction random : nombre compris entre 1 (pas 0) et 100 [Turbo Pascal]


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut La fonction random : nombre compris entre 1 (pas 0) et 100
    Salut à tous,
    j'ai une petite question sur la fonction random :
    est-il possible de demander à Pascal de créer un nombre aléatoire compris entre 1 et 100 par exemple, au lieu de 0 et 100 ??
    Si oui, comment ?
    Merci

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    gao,

    - Tu génères une valeur de 0 à 99
    - tu ajoutes 1


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Par défaut
    ou bien tu mets random dans une boucle repeat until avec la condition que random(101)<>0

  4. #4
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Citation Envoyé par mah00
    ou bien tu mets random dans une boucle repeat until avec la condition que random(101)<>0
    c'est cool ce que tu proposes sauf c'est pas du tout optimal parce que c'est du temps(je parle en des milliemes de seconde) en plus à l'ordinateur pendant l'execution à cause du test sur le repeat/until(on est tous d'accord qu'avec une instruction pareille c'est instantannée mais c'est moins rapide que ce que propose droggo) donc je te conseille plutot la methode de droggo
    @+

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Hio,
    Citation Envoyé par mah00
    ou bien tu mets random dans une boucle repeat until avec la condition que random(101)<>0
    Comme te l'a dit krachik, ce n'est pas optimal d'une part, et d'autre part manque de généralité.

    Poussons un peu à l'extrême : tu veux générer une valeur 10000 <= n <= 10005.

    Tu vas refaire le coup de la boucle repeat ?
    Avec l'inconvénient supplémantaire que random(v) ne renvoyant que des valeurs de 0 à v, comment obtiendras-tu des valeurs négatives ?

    Une saine habitude en programmation est d'essayer de faire du code le plus général (ou généralisable) possible, ce qui n'est pas toujours évident, bien entendu.

    Ainsi, la méthode que j'ai proposée se généralise immédiatement pour définir une fonction renvoyant un entier compris entre 2 bornes:
    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
    function RamdomRange(min, max : integer) : integer;
    var
      range : integer;
    begin
      { on prend la peine de vérifier que min < max,
         histoire de prévoir une étourderie du programmeur.
         si ce n'est pas le cas, on les inverse }
      if min > max then
      begin
        min := min xor max;
        max := max xor min;
        min := min xor max;
      end;
     
      { la gamme à générer, de 0 à range }
      range := max - min + 1;
     
      { et le résultat }
      RamdomRange := min + Random(range);
    end;

  6. #6
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Et le plus important :

    avec une boucle repeat ... until tu ne peux pas prouver que ton algorithme termine !

    Bien sûr il a de fortes chances de terminer, mais rien ne peut le prouver. Si par exemple la fonction random est bugguée et que pour x ou y raisons elle renvoie toujours la même valeur : 0 sur ta machine, ton code bouclera à l'infini.

  7. #7
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonjour,
    Citation Envoyé par droggo
    - Tu génères une valeur de 0 à 99
    - tu ajoutes 1
    Soit a, une variable qui doit avoir une valeur aléatoire comprise entre 1 et 100;
    En pascal on écrirait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    program algorithme_de_droggo // tout à fait correct
    begin
      randomize ;
      a := random(100)+1 ;
      writeln(a) ;
    end.
    Citation Envoyé par droggo
    Avec l'inconvénient supplémantaire que random(v) ne renvoyant que des valeurs de 0 à v
    je ne suis pas d’accords:
    En effet, contrairement à ce dit droggo (sans doute un p’tit oubli), random(v) retourne une valeur comprise entre 0 et v-1;

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Par défaut
    Citation Envoyé par Loceka
    Et le plus important :

    avec une boucle repeat ... until tu ne peux pas prouver que ton algorithme termine !

    Bien sûr il a de fortes chances de terminer, mais rien ne peut le prouver. Si par exemple la fonction random est bugguée et que pour x ou y raisons elle renvoie toujours la même valeur : 0 sur ta machine, ton code bouclera à l'infini.
    Si cela nous arrive un jour,on peut dire qu'on a la poisse!!
    Autre chose,pour le temps d'execution,il est vrai que meme ces millieme de secondes ralentissent considerablement le programme,mais si c'est pour un algorithme simple,je crois qu'on peut y penser...
    Parce que a force de chercher des instructions generalisable (je cite) on risque de faire de l'inutile!
    Mais il est vrai qu'a un certain niveau,on ne peut pas y échapper.

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

Discussions similaires

  1. [RegEx] RegEx : avoir un nombre compris entre 1 et 12
    Par ludovic79 dans le forum Langage
    Réponses: 6
    Dernier message: 02/10/2009, 20h34
  2. Réponses: 3
    Dernier message: 11/08/2009, 11h39
  3. Réponses: 7
    Dernier message: 24/03/2008, 13h54
  4. trouver un nombre compris entre deux nombres
    Par piloulit dans le forum Excel
    Réponses: 1
    Dernier message: 30/11/2007, 07h15
  5. [RegExp]Nombre compris entre 2 valeurs
    Par MystEre dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 18/11/2006, 12h02

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