如何在Scheme中的范围内生成唯一的整数列表。 (DrRacket)

时间:2013-11-01 00:45:00

标签: list random scheme unique

我在尝试定义一个函数时遇到了一些麻烦,该函数生成了[0,y]范围内随机整数的长度x列表。以下是生成随机整数列表的代码:

(define (random-list range list-length)
  (cond
    [(zero? length) empty]
    [else (cons (random range) (random-list range (sub1 list-length)))]))

麻烦的是,如果我尝试将此代码转换为使用递归生成从0到(范围-1)长度(列表长度)的唯一随机整数列表的代码。我似乎无法找到一种方法来检查生成的随机数是否已经在正在创建的列表中。这段代码永远运行:

(define (random-list range list-length)
  (cond
    [(zero? list-length) empty]
    [else
     (cond
       [(member? (random range) (random-list range list-length))
        (random-list range list-length)]
       [else
        (random-list range (sub1 list-length))])]))

有什么想法吗? (我正在使用DrRacket,初学者)

1 个答案:

答案 0 :(得分:1)

第一个程序有错误,您应该检查list-length是否为零,而不是length。关于第二个过程,检查元素是否已经在列表中的测试是错误的,在检查元素是否已经存在时调用random-list然后再次调用它,但是您从未保存生成的值。在每种情况下生成的数字可能会有所不同,无论如何你不是cons结果。必须采用完全不同的方法。

; create a helper that accumulates the generated elements
(define (random-list-h acc range len)
  (cond [(zero? len) acc] ; if we're done, return accumulator
        [else
         (let ((num (random range))) ; generate and save a random number
           (cond [(member? num acc)  ; if it's already in the accumulator
                  (random-list-h acc range len)] ; then ignore it
                 [else ; otherwise add to accumulator and advance recursion
                  (random-list-h (cons num acc) range (sub1 len))]))]))

(define (random-list range list-length)
  ; call helper with initial empty accumulator
  (random-list-h '() range list-length))

它会像宣传的那样工作:

(random-list 10 5)
=> '(5 3 7 9 6) ; just an example