球拍:从2个不同功能的列表中获取相同的随机元素

时间:2017-06-04 14:10:13

标签: racket

我想从list1中选择一个随机元素,将其从list1中删除,然后将其添加到list2中 (define list1 '(1 2 3 4 5 6 7 8) (define list2 '(9 10)
现在我的问题是,我使用2个函数来更新列表 list1将删除一个随机元素,list2将获得一个随机元素,但它并不总是相同的元素 如何使list2获取添加的元素,list1被删除,然后重复这些步骤,直到list1为空? 非常感谢提前

#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 个答案:

答案 0 :(得分: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))方式。