我想编写一个给出列表和百分比的程序,将列表拆分为两个不同的大小列表。它应该随机选择元素,这样创建的列表总是不同的。 这些代码能够做到这一点:
(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从初始列表中随机获取一个元素。并且所有元素都用于创建两个列表。
答案 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