Racket,将列表拆分为两个不同大小的列表。并随机

时间:2017-04-14 06:53:33

标签: racket

我想编写一个给出列表和百分比的程序,将列表拆分为两个不同的大小列表。它应该随机选择元素,这样创建的列表总是不同的。 这些代码能够做到这一点:

(define (clamp x a b)
  (max (min x b) a))

(define (split pct xs)
  (define pos (exact-round (* (clamp pct 0.0 1.0) (length xs))))
  (split-at (shuffle xs) pos))

以下是一个例子:

(拆分0.25'(1 2 3 4 5 6 7 8 9))

'(6 2)

'(3 7 1 4 5 8 9)

但是,我希望使用此功能来实现相同的目标,而不是“shuffle”:

(define (get-randomly-no-pair list)
  (list-ref list (random (length list))))

因此,get-random-no-pair从初始列表中随机获取一个元素。并且所有元素都用于创建两个列表。

1 个答案:

答案 0 :(得分:0)

(define (shuffle-list lst)
  (define indexes (shuffle (range (length lst))))
  (lambda ()
    (begin0
      (list-ref lst (car indexes))
      (set! indexes (cdr indexes)))))

(define gen (shuffle-list (list 10 12 14 16 18 20))
(gen) ; ==> 14 (e.g.)

现在我看到你假设你需要通过列表然后我宁愿做一个映射器:

(define (shuffle-accessor len)
  (define indexes (list->vector (shuffle (range len))))
  (lambda (lst index)
    (list-ref lst (vector-ref indexes index))))

(define lst3-ref (shuffle-accessor 3))
(lst3-ref '(1 2 3) 0) ; ==> 3 (e.g.)
(lst3-ref '(6 7 8) 0) ; ==> 8