2013-11-01 36 views
0

我一直有一些麻煩,試圖定義一個函數,該函數生成範圍[0,y)內隨機整數長度x的列表。這裏是產生隨機整數列表的代碼:如何在Scheme中的範圍內生成唯一的整數列表。 (DrRacket)

(define (random-list range list-length) 
    (cond 
    [(zero? length) empty] 
    [else (cons (random range) (random-list range (sub1 list-length)))])) 

麻煩的是,如果我嘗試把這個代碼爲一個從0生成的唯一的隨機整數的列表至(範圍 - 1)長度的(列表長度)使用遞歸。我似乎無法找到一種方法來檢查生成的隨機數是否已經在正在創建的列表中。此代碼將永久運行:

(define (random-list range list-length) 
    (cond 
    [(zero? list-length) empty] 
    [else 
    (cond 
     [(member? (random range) (random-list range list-length)) 
     (random-list range list-length)] 
     [else 
     (random-list range (sub1 list-length))])])) 

任何想法? (我正在使用DrRacket,開始學生)

+0

請不要編輯基礎上,人們張貼在回答你的問題的代碼。例如,當你根據Öscar的建議改變代碼時,「你應該檢查'list-length'是否爲零,而不是'長度',」你使他的答案的一部分不再有意義。如果你解決了人們發現和編輯問題的所有事情,那麼沒有任何答案是有道理的。我回滾了編輯。 –

+1

哦,這很有趣,謝謝我沒有意識到這一點,並將在未來銘記在心。就在我最初發布代碼之後,我注意到我沒有爲輸入值使用非常好的名稱並對其進行了更改,但忘記將該名稱從長度更改爲特定行中的列表長度。 – Plopperzz

回答

1

第一個過程有錯誤,您應該檢查list-length是否爲零,而不是length。關於第二個程序,檢查一個元素是否已經在列表中是錯誤的,當你檢查元素是否已經存在,然後再次調用時,你可以調用random-list,但是你永遠不會保存生成的值。在每種情況下生成的數字可能會有所不同,並且無論如何,您並不是結果。必須使用完全不同的方法。

; create a helper that accumulates the generated elements 
(define (random-list-h acc range len) 
    (cond [(zero? len) acc] ; if we're done, return accumulator 
     [else 
     (let ((num (random range))) ; generate and save a random number 
      (cond [(member? num acc) ; if it's already in the accumulator 
        (random-list-h acc range len)] ; then ignore it 
       [else ; otherwise add to accumulator and advance recursion 
        (random-list-h (cons num acc) range (sub1 len))]))])) 

(define (random-list range list-length) 
    ; call helper with initial empty accumulator 
    (random-list-h '() range list-length)) 

它會工作爲標榜:

(random-list 10 5) 
=> '(5 3 7 9 6) ; just an example 
+0

啊謝謝,我只是注意到我並沒有在第二個函數中創建一個列表。多麼愚蠢。感謝您的建議,但是我無法使用它,因爲我正在使用初級學生級別(剛開始在大學學習),並且我不想偏離它,直到我知道如何正確實施更高級的程序。 – Plopperzz

+0

@Plopperzz你可以使用上面的大部分答案。棘手的和不可避免的部分是你將如何保存生成的隨機值?因爲你需要使用兩次相同的值:第一次測試它是否存在,第二次是實際添加它。如果沒有'let',這很難做到 –

相關問題