2017-04-14 4 views
0

私は、リストとパーセントを与えたプログラムをコーディングして、2つの異なるサイズリストでリストを分割したいと思います。それは要素のランダムな選択を持っている必要があります、そのように作成されたリストは常に異なっています。 これらのコードは、それを行うことができる:ここラケットは、2つの異なるサイズリストでリストを分割します。無作為に

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

しかし、代わりに "シャッフル" 私は同じことを達成するために、この機能を使用したいの:

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

したがって、get-randomly-no-pairは、最初のリストからランダムに1つの要素を取ります。そして、両方のリストを作成するために、すべての要素が使用されます。

答えて

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.) 

今、私はあなたが、私はむしろ、マッパーになるだろう、リストを渡す必要があると仮定参照:thatsは、回答@sylwesterため

(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 
+1

おかげで私は、私は自分自身を明確にしていなかったと思いますなぜ私は質問を編集したのですか?希望、私は達成したいことを理解することがより簡単になりました。ありがとう! –

+0

@RobJrまだ明確ではありません。あなたの関数 'split'はあなたの例に従って何をしたいのですか?' shuffle'を置き換える必要があるのはなぜですか? – Sylwester

+0

お返事ありがとうございます。私はラケットを学んでいるので(もっと良い定義は私がラケットに苦しんでいるということです)、リストからランダムに要素を取り除いてその要素をリストから削除する方法を見てみたい(少なくとも私がそれをやる方法です) –

関連する問題