2017-06-04 48 views
-1

我想從列表1中選取一個隨機元素,將它從列表1中刪除,並將其添加到列表2中。
(define list1 '(1 2 3 4 5 6 7 8) (define list2 '(9 10)
現在我的問題是,我使用2個函數來更新列表。
list1將得到一個隨機元素,而list2將得到一個隨機元素,但它並不總是相同的元素。
我怎樣才能讓list2獲得元素添加,該list1被刪除,然後重複這些步驟,直到list1爲空?
非常感謝提前球拍:從列表中獲取2個不同函數中的相同隨機元素

#lang racket 
(define list1 '(1 2 3 4 5 6 7 8)) 
(define list2 '(9 10)) 

(define (select_random list) 
    (car (shuffle list))) 

(define (update_list list) 
    (remove (select_random list) list)) 

(define (addToList list1 target_list) 
    (append (list (select_random list1)) target_list)) 
+1

您將索引傳遞給兩者?在刪除之前,您需要複製。這將有助於看到一些代碼。 – Sylwester

+0

添加代碼。我將這個列表洗牌,然後從中取出第一個元素。問題是,每當我調用函數時,它都是一個隨機元素。 「刪除前複製」是什麼意思? – User91

回答

0

的方式隨機選擇一個元素使用幾個地方是做它的功能外:

(define (select-random lst) 
    (car (shuffle lst))) 

現在,您需要使用元素做你的東西:

(define (remove-element element lst) 
    (remove element lst)) 

(define (add-element element lst) 
    (cons element lst)) 

所以,在你的循環,你可以做這樣的事情:

(let loop ((list1 '(1 2 3 4 5 6 7 8 9 10)) 
      (list2 '())) 
    (if (null? list1) 
     list2 
     (let ((element (select-random list1))) 
     (loop (remove-element element list1) 
       (add-element element list2))))) 

; ==> (2 1 5 4 10 7 6 8 9 3) 

注意remove-elementadd-element是真正爲removecons只是同義詞。他們不增加任何價值,但改變名稱。因此,你可以,忽略它們:

(let loop ((list1 '(1 2 3 4 5 6 7 8 9 10)) 
      (list2 '())) 
    (if (null? list1) 
     list2 
     (let ((element (select-random list1))) 
     (loop (remove element list1) 
       (cons element list2))))) 

在現實中,這只是一個做(shuffle '(1 2 3 4 5 6 7 8 9 10))非常複雜的方式。

+0

非常感謝您的回答。循環看起來很好,我仍然缺少的一件事是我如何訪問列表讓我們說一個循環後。 (remove-element element lst)=>'(1 3 4 5 6 7 8 9 10)和(add-element element lst)=>'(2)。 – User91

+0

@ User91在循環調用之前的'let'主體中,但它不包含基本情況。 – Sylwester

相關問題