方案:组合随机和子串

时间:2012-09-03 23:26:30

标签: random scheme substring

我正在尝试创建一个用户输入非空字符串的过程,然后在长度为1的子字符串中返回输入中的随机字母。

即。

(pick-at-random "word")

~"w"

(pick-at-random "word")

~"r"

到目前为止,我已经:

    (define pick-at-random
      (lambda (s)
        (substring s (random(string-length s)) ())))

这给了我想要显示的字母的位置,我感觉像()的位置,我应该有一些表示子字符串的起始值的变量,然后添加一个。但是,我不知道该怎么做。简单地说,我问我如何在起始值中使用随机函数将子字符串限制为长度为一。

3 个答案:

答案 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”的解决方案相同。