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

Scheme Discussion :

Obtenir un entier aléatoire


Sujet :

Scheme

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Lille

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 17
    Points
    17
    Par défaut Obtenir un entier aléatoire
    Bonjour,

    Je suis en train de programmer un petit jeux en scheme qui utilise un dé.
    Après quelques recherche je suis tombé sur cette procédure qui renvoie un chiffre aléatoire :
    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
    (define random-maker
        (let* ((multiplier 48271)
               (modulus 2147483647)
               (apply-congruence
                (lambda (current-seed)
                  (let ((candidate (modulo (* current-seed multiplier)
                                           modulus)))
                    (if (zero? candidate)
                        modulus
                        candidate))))
               (coerce
                (lambda (proposed-seed)
                  (if (integer? proposed-seed)
                      (- modulus (modulo proposed-seed modulus))
                      19860617))))  ;; an arbitrarily chosen birthday
          (lambda (initial-seed)
            (let ((seed (coerce initial-seed)))
              (lambda args
                (cond ((null? args)
                       (set! seed (apply-congruence seed))
                       (/ (- modulus seed) modulus))
                      ((null? (cdr args))
                       (let* ((proposed-top
                               (ceiling (abs (car args))))
                              (exact-top
                               (if (inexact? proposed-top)
                                   (inexact->exact proposed-top)
                                   proposed-top))
                              (top
                               (if (zero? exact-top)
                                   1
                                   exact-top)))
                         (set! seed (apply-congruence seed))
                         (inexact->exact (floor (* top (/ seed modulus))))))
                      ((eq? (cadr args) 'reset)
                       (set! seed (coerce (car args))))
                      (else
                       (display "random: unrecognized message")
                       (newline)))))))
      
      (define random
        (random-maker randomnumber)) ;; randombumber 
    Cependant, pour que (random n) renvoie des valeurs différente à chaque fois que je relance mon programme, on conseille d'initialiser randomnumber (cad le seed) grace au run-time et wall-clock-time.

    Il donne m^me en exemple comment faire dans SCM cad
    (random-maker (+ (* 100000 (get-internal-run-time)) (current-time)))

    Moi je travaille avec Dr Scheme, et je n'ai pas trouver d'équivalent (au passage ça ne fait que qq mois que je programme en scheme)

    Donc si vous savez comment y faire appel avec Dr Scheme ou m^me une autre solution plus élégante pour générer un chiffre aléatoire, je vous serais en très reconnaissant !

    Encore merci pour votre aide !

  2. #2
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Lille

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    J'en profite pour poser une question plus générale sur la manière de bien programmer de façon orienté object en scheme :

    Imaginons que j'ai en object qui encapsule un autre. Si j'ai une fonction, dans mon premier object, qui modifie plusieurs attributs, est-il conseiller de définir une fonction pour chaque modification de l'object, et d'ensuite appeler ces dernières dans ma première fct, m^me si ces 'petites' fct ne sont pas utilisé directement sur l'object ?

    Plus concrètement si j'ai

    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
    (define (Obj)
       (let((autreObj make-autreObj))
             ...
             (define (modifAutreObj)
                        (begin (autreObj 'changePremierAttribut)
                                 (autreObj 'changeSecondAttribut)
                                  ....
                                   ))
        ...
        ))
    
    ne vaudrait-il pas mieux que je fasse ?
    
    (define (Obj)
       (let((autreObj make-autreObj))
             ...
             (define (changePremierAttribut)
                       (autreObj 'changePremierAttribut))
              (define (changeSecondAttribut)
                       (autreObj 'changeSecondAttribut))
               ...
    
    
             (define (modifAutreObj)
                        (begin (changePremierAttribut)
                                 (changeSecondAttribut)
                                  ....
                                   ))
        ...
        ))
    sachant que je n'appellerait jamais directement change"n-ieme"Attribut sur un oject de type Obj.

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Remarque: je ne lirais pas ton code si tu n'utilises pas la balise appropriée.

    Sinon il me semble que tu t'es bien fatigué pour faire un random
    MIT Scheme
    PLT Scheme

    Ça devrait suffire non ?

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

Discussions similaires

  1. Fonction de tri nombres entiers aléatoires
    Par mabengos dans le forum Assembleur
    Réponses: 2
    Dernier message: 12/10/2008, 09h54
  2. Obtenir un entier à partir d'un tableau de bytes
    Par Papy214 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/04/2008, 15h45
  3. Réponses: 2
    Dernier message: 27/05/2007, 22h23
  4. Comment obtenir un entier aléatoire ?
    Par papagalli dans le forum Ada
    Réponses: 12
    Dernier message: 30/11/2006, 21h54
  5. comment obtenir une ligne aléatoirement
    Par titoumimi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/05/2005, 15h52

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