2016-11-12 103 views
-1

你好,我有這個功能,隨機:a,b,c或d。球拍隨機功能

(define random-abcd 
    (let ([n (random 4)]) 
    (cond [(equal? n 0) 'A] 
      [(equal? n 1) 'B] 
      [(equal? n 2) 'C] 
      [else 'D]))) 

這意味着我有4個可能的隨機輸出。但我想建立一個recusrsive函數,它給出了一個作爲參數給出的數字之間的輸出。

例如:

隨機我的3 - >給出了與輸出之間:一個B或C

隨機我的5 - >給出之間輸出:A B C d或e

謝謝!

回答

1

你可以通過一些n,你可以做(random n)獲得範圍[0,n>一個隨機數r。現在爲#\a的字符數爲97所以如果你做(integer->char (+ 97 r))#\a0#\b1,...

你可以得到(list->string (list #\a)) ; ===> "a"的字符串。

你可以得到一個符號以(string->symbol "a") ; ==> a

我讓你把它放在一起,但它不是遞歸。

+0

這是更具可讀性(便攜,雖然我知道這個問題是關於專門針對Racket的)使用'(char-> integer#\ a)'而不是97.而且,它是'integer-> char',而不是'號 - > char'。 –

+0

@ ChrisJester-Young我總是在這些程序中混淆了'number'和'integer',所以我更新了。 '(char-> integer#\ a)'與ascii中的'97'相同,utf-8以7位ascii開頭,所以它不會像你會得到不同的答案,但也許爲了清晰起見,它可能會更好。 – Sylwester

1

有趣的問題。我可以想到的一種方法是使用矢量(因爲它是零索引和隨機訪問)並給定數字,選擇一個小於該值的隨機數。一旦你有了這個數字,然後用它作爲向量的索引來獲得該索引處的向量中的字符。本質上,您只是隨機索引到矢量的「切片」中,切片大小由輸入參數確定。

0

嘗試:

(list-ref '(a b c d e f) (random 6)) 
0

遞歸FN產生的N個字母隨機列表,直到第n個字母:

(define (f n (ol '())) 
    (if (= n (length ol)) 
     ol 
     (f n (cons (string (integer->char (+ 97 (random n)))) ol)))) 

測試:

(f 5) 

輸出:

'("b" "d" "b" "e" "e") ; list will have random letters;