我正在使用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))
然后对于randomNumber的每个不同的可能结果重复if块。我需要知道的是如何从命令行重复调用我的猜测函数,命令行使用currentGameList,而不是我的程序每次都重新创建currentGameList。 guess函数还有必须由用户输入的参数,因此每次都必须在命令行输入。任何帮助表示赞赏。
答案 0 :(得分: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))