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

Racket 球拍,将列表拆分为两个不同大小的列表。随机,racket,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)) 以下是一个例子: (拆

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

(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'(123456789))

"(6 2)

"(3 7 1 4 5 8 9)

但是,我不想使用“shuffle”,而是想使用此函数实现相同的功能:

(define (get-randomly-no-pair list)
  (list-ref list (random (length list))))
因此,随机获取没有一对从初始列表中随机获取一个元素。所有元素都用于创建这两个列表

(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

谢谢你的回答@Sylvester,但我想我没有说清楚,这就是为什么我编辑了这个问题。希望,现在更容易理解我想要实现的目标。谢谢@RobJr还不是很清楚。您的函数
split
实现了您想要的功能根据您的示例,您为什么需要替换
shuffle
?感谢您的回答。因为我正在学习球拍(更好的定义是我正在与球拍斗争),我想看看如何从列表中随机抽取元素并从列表中删除该元素(至少是我会这样做)@RobJr你不再是堪萨斯州了!在
#lang racket
中,列表是不可变的。您需要将语言更改为标准方案或使用不同的数据结构(
mcons
),但删除第一个元素时仍会遇到问题。你应该尽量让你的代码发挥作用,然后你需要避免绑定和对象的变异。谢谢!!你的评论(对我)很有用