2010-11-13 6 views
3

J'essaie d'obtenir une chaîne aléatoire à partir d'une liste de chaînes dans le schéma. Exemple de liste ("this" "que" "aujourd'hui" "hier") Donc, basé sur la longueur de la liste, un nombre aléatoire est créé et ce mot est sorti. Mais continue d'avoir des erreurs!fonction aléatoire dans le schéma

Je l'ai essayé comme ceci:

;; produces random number that should be input to the random-function 

(define (random-num list) 

(random-function ((random (length (list))) list))) 

;; loops the number of times till random number is 0 and outputs the list value 

(define (random-function num list) 
    (cond 
    [(zero? num) (car list)] 
    [else (random-function (- num 1) (cdr list))])) 

Erreur:

procedure application: expected procedure, given: 
("this" "that" "today" "yesterday") (no arguments) 

Lorsque je tente de faire:

(random-function (random (length list)) 

sur la console que je reçois un nombre aléatoire.

Je ne comprends pas pourquoi il plante ici quand il est fait dans mon programme ??? Pourrais-je mieux faire cela plutôt que de boucler autant de fois? En Java j'aurais utilisé un tableau et donné la position directement. De toute façon pour le faire dans le schéma aussi?

Répondre

10
(define (random-element list) 
    (list-ref list (random (length list)))) 
+0

u r génial !! list-ref est génial !! semble mieux que les tableaux maintenant :) – JJunior

+2

Eh bien, les vecteurs sont encore mieux si vous avez vraiment de grandes listes, sinon la différence est négligeable. –

+1

Les vecteurs sont meilleurs parce que vous pouvez sauter instantanément à l'élément 'n', alors que les listes doivent commencer par le début et trouver votre chemin vers l'élément' n'. – erjiang