Racket 建立一个随机列表

Racket 建立一个随机列表,racket,Racket,我正在尝试编写一个函数,它接受一个列表的长度和一个最大值,并返回一个列表,该列表的长度是给定的,数字在1和给定的最大值之间 到目前为止我有 (define (randomlist n max) (cond [(= n 0)empty] [else (cons (build-list n (random 1 max)) (randomlist max (- n 1)))])) 运行此程序时,我遇到一个错误,不知道是否有人可以帮我解决。您的代码中有几个错

我正在尝试编写一个函数,它接受一个列表的长度和一个最大值,并返回一个列表,该列表的长度是给定的,数字在1和给定的最大值之间

到目前为止我有

(define (randomlist n max)
(cond
  [(= n 0)empty]
  [else
      (cons (build-list n (random 1 max))
            (randomlist max (- n 1)))]))

运行此程序时,我遇到一个错误,不知道是否有人可以帮我解决。

您的代码中有几个错误:

  • 调用与内置过程冲突的参数
    max
    ,这是个坏主意。因此我将其重命名为
    mx
  • 绝对没有理由使用
    构建列表
    ,这不是我们构建输出列表的方式,只是
    cons
    一个元素和其余元素
  • random
    接收零个或一个参数,而不是两个。单参数版本返回范围
    0..n-1
    的整数,因此我们必须将
    1
    添加到范围
    1..n
    的结果中
  • 递归调用
    randomlist
    时,您切换了参数的顺序
这应该解决以下问题:

(define (randomlist n mx)
  (cond
    [(= n 0) empty]
    [else
     (cons (+ 1 (random mx))
           (randomlist (- n 1) mx))]))
它按预期工作:

(randomlist 5 10)
=> '(10 7 1 4 8) ; results will vary, obviously

您的代码中有几个错误:

  • 调用与内置过程冲突的参数
    max
    ,这是个坏主意。因此我将其重命名为
    mx
  • 绝对没有理由使用
    构建列表
    ,这不是我们构建输出列表的方式,只是
    cons
    一个元素和其余元素
  • random
    接收零个或一个参数,而不是两个。单参数版本返回范围
    0..n-1
    的整数,因此我们必须将
    1
    添加到范围
    1..n
    的结果中
  • 递归调用
    randomlist
    时,您切换了参数的顺序
这应该解决以下问题:

(define (randomlist n mx)
  (cond
    [(= n 0) empty]
    [else
     (cons (+ 1 (random mx))
           (randomlist (- n 1) mx))]))
它按预期工作:

(randomlist 5 10)
=> '(10 7 1 4 8) ; results will vary, obviously

还可以使用
for/list
组合循环和列表形成:

(define (randomlist n mx)
  (for/list ((i n))
    (add1 (random mx))))
测试:

(randomlist 5 10)
输出:

'(5 9 10 4 7)  

(随机数,因此每次输出很可能不同)。

也可以使用
for/list
将循环和列表形成结合起来:

(define (randomlist n mx)
  (for/list ((i n))
    (add1 (random mx))))
测试:

(randomlist 5 10)
输出:

'(5 9 10 4 7)  

(随机数,因此每次输出都很可能不同)。

这有助于了解您得到的错误。为什么您要切换
n
max
的顺序?这将有助于了解您得到的错误。为什么您要切换
n
max
的顺序?@JohnC如果这个或任何其他答案解决了您的问题,别忘了做这件事;)很简单,只需点击左边的复选标记。@JohnC如果这个或任何其他答案解决了您的问题,请不要忘记;)很简单,只需点击左边的复选标记。