我正在尝试创建一个用户输入非空字符串的过程,然后在长度为1的子字符串中返回输入中的随机字母。
即。
(pick-at-random "word")
~"w"
(pick-at-random "word")
~"r"
到目前为止,我已经:
(define pick-at-random
(lambda (s)
(substring s (random(string-length s)) ())))
这给了我想要显示的字母的位置,我感觉像()的位置,我应该有一些表示子字符串的起始值的变量,然后添加一个。但是,我不知道该怎么做。简单地说,我问我如何在起始值中使用随机函数将子字符串限制为长度为一。
答案 0 :(得分:2)
您可以使用let
将随机数绑定到变量。
(define pick-at-random
(lambda (s)
(let ((index (random (string-length s))))
(substring s index (+ index 1)))))
答案 1 :(得分:1)
这是不使用substring
的替代答案,这样您就不需要在let
绑定中保存索引。它是解决问题的更具功能性(因而也是惯用语)的解决方案:
(define (pick-at-random s) ; read the following lines from bottom to top
(string ; convert single character to string
(string-ref s ; access character in string, given an index
(random (string-length s))))) ; generate a random valid index in the string
(pick-at-random "word")
> "d" ; random result
上一过程生成随机有效索引,然后在字符串中选择该位置的字符。作为最后一步,它将单个字符转换为长度为1的字符串。
答案 2 :(得分:0)
前两个答案都没问题。或者,您可以将此问题分解为两个问题:
开发接受单词和索引的函数“nth-char”,并返回包含单词第n个字符的字符串。
开发符合您所描述内容的“随机选择”功能。 (顺便说一句,我认为像“random-char”这样的名字比“随机选择”要好一些。)
这种分解通过使其成为另一个函数的参数来解决您描述的问题。
“引擎盖下”,这与使用“let”的解决方案相同。