您的位置:首页 > 其它

P23 (**) Extract a given number of randomly selected elements from a list.

2016-01-22 21:46 309 查看

问题描述

The selected items shall be returned in a list.

sash> (rnd-select '(a b c d e f g h) 3)
-> (e d a)


Hint: Use the built-in random number generator and the result of problem P20.

解法

(import (srfi 27))

(define rnd-select
(lambda (ls n)
(let f ([s ls] [n n])
(cond
[(zero? n) '()]
[else
(let ([i (random-integer (length s))])
(cons (list-ref s i)
(f (remove-at s (+ i 1)) (- n 1))))]))))


需要说明几点:

- R7RS没有自带随机数的函数,这里使用了SRFI-27中的
random-integer n
产生
[0,n)
间的随机整数;

- 使用了P20定义的
remove-at
函数,该函数指定的列表索引从1开始,而
list-ref
指定的列表索引从0开始,所以索引需要做简单转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scheme lisp