0

我正在使用 Racket,我想做的是开发一个给定元素的随机列表,这些元素也具有给定的长度。我知道如何创建列表,但我遇到的问题是我不知道如何在每次从命令行使用列表调用函数时保持相同的列表,而无需重新创建不同的列表因为列表由随机选择的元素组成。这就是我所拥有的:

(define gameColors '(red green blue yellow black))
(define currentGameList '())
(define input 4)
(define randomNumber (random 5))

(if (equal? randomNumber 0)
  (if (< (length currentGameList) (+ input 1))
      (set! currentGameList (append currentGameList (list (car gameColors))))
      ;;otherwise
      (set! currentGameList currentGameList))
  ;;otherwise
  (set! currentGameList currentGameList))

然后 if 块为 randomNumber 的每个不同的可能结果重复。我只需要知道如何从使用 currentGameList 的命令行重复调用我的guess 函数,而无需我的程序每次都重新创建 currentGameList。guess 函数还具有必须由用户输入的参数,因此每次都必须在命令行中输入。任何帮助表示赞赏。

4

1 回答 1

1

第一件事:避免使用set!. 在另一种编程语言中,您会使用变量的变异来解决问题,但这不是 Scheme 的方式。问题中的代码不起作用,它上面没有任何东西在颜色列表上进行迭代或重复,并且gameColors每次只选择第一个元素(它没有任何随机性)。如果我理解了这个问题(这有点令人困惑),这就是您的目标:

(define (generate-random lst len)
  (for/list ([x (in-range len)])
    (list-ref lst (random (length lst)))))

(generate-random '(red green blue yellow black) 4)
=> '(black black blue green) ; one possible output

当然,如果您需要保存由一次调用生成的特定列表generate-random(因为每次结果都会不同),只需将该列表存储在变量中以供将来使用:

(define currentGameList (generate-random '(red green blue yellow black) 4))
于 2013-03-22T04:22:10.547 回答