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

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Points : 7
    Points
    7
    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 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    gao,

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

    Si les cons volaient, il ferait nuit à midi.

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

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

  4. #4
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    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
    @+
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    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;
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Expert confirmé
    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
    Points : 4 845
    Points
    4 845
    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 actif 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
    Points : 261
    Points
    261
    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
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Jui,
    Citation Envoyé par Ultima
    Bonjour,
    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.
    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;
    Oui, c'est vrai.

    Confusion car celles que j'utilise (générateur personnel) ont le comportement que j'ai cité.

    La force de l'habitude.

    [b]Edité[/]

    J'ai corrigé mon code pour tenir compte de cette erreur.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    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.

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Juo,
    Citation Envoyé par mah00
    Si cela nous arrive un jour,on peut dire qu'on a la poisse!!
    Comme petit test, je viens de vérifier : si on oublie "randomize", la version de TP7 que j'ai (prise ici) renvoie toujours 0 pour random(n).

    Ce n'est pas le cas de FreePascal, mais les valeurs semblent moins bien remplir la gamme voulue si on ne met pas randomize (ce n'est qu'une impression "à l'oeil", donc fort probablement fausse, même si ça semble assez reproductible. )

    Citation Envoyé par mah00
    Parce que a force de chercher des instructions generalisable (je cite) on risque de faire de l'inutile!
    Parfois, mais c'est un bon exercice, car on apprend ainsi beaucoup de choses au passage, et surtout, si un code est prévu pour, on peut le récupérer pour usage dans d'autres programmes (c'est là un point très important).
    Sauf cas très particulier, qui peut jurer "je n'aurais jamais besoin d'un code ressemblant à ce que je fais en ce moment" ?
    Si les cons volaient, il ferait nuit à midi.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par droggo
    Comme petit test, je viens de vérifier : si on oublie "randomize", la version de TP7 que j'ai (prise ici) renvoie toujours 0 pour random(n).
    Moi j'ai TPW 1.5, et si je ne mets pas randomize; les valeurs données sont certes aléatoires mais elles ne changent pas d'une execution a l'autre.Mais le programme ne m'a jamais affiché 0!

  12. #12
    Expert confirmé
    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
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par mah00
    Moi j'ai TPW 1.5, et si je ne mets pas randomize; les valeurs données sont certes aléatoires mais elles ne changent pas d'une execution a l'autre.Mais le programme ne m'a jamais affiché 0!
    Donc ça va plutôt dans mon sens.

    Mettons que tu écrives ton programme en "oubliant" le randomize et que chez toi ça fonctionne bien avec ton compilateur.

    Tu le recompiles sur un autre compilateur (TP7) ou bien tu le donnes à quelqu'un qui le recompile sous TP7, après lui avoir assuré que ça marchait chez toi et là, paf, boucle infinie.

    De tout façon, un repeat ... until dans ce cas-là est bien plus mauvais qu'un addition (et aussi comme l'a dit Droggo bien moins réutilisable).

    Faire une addition se fait en temps constant et en un très petit nombre de cycles processeurs.
    Un repeat est un test donc l'operation ne demande pas grand chose en soit non plus mais n'est pas beaucoup moins coûteuse qu'une addition.

    Donc si tu fais 2 tests ( = 2 tours de boucles) au lieu d'un tu perds déjà pas mal de temps par rapport à une simple addition.
    Le problème c'est que tu n'en fais pas 1 mais un nombre aléatoire supérieur ou égal à 1. Donc la plupart du temps tu es perdant.


    Bon, là tu peux dire que c'est du chipotage, qu'en réalité sur les machines actuelles ça ne fait aucune différence, eh bien non.

    Mettons que tu créés une fonction qui te génére un nombre aléatoire compris entre 2 bornes et que tu te serves pour ça d'un repeat. Et mettons que tu veuilles implémenter un algorithme basé sur le hasard (par exemple un algorithme génétique).

    Dans ce cas tu ne vas pas appeller ta fonction une seule fois mais de millions de fois. Et là je t'assure que tu vas sentir la différence !

  13. #13
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Ultima Voir le message
    Bonjour,
    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.
    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;
    avec moi ne fonctionne pas

+ 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