【问题标题】:How to choose a random word from a list of words in racket?如何从球拍中的单词列表中选择一个随机单词?
【发布时间】:2021-07-07 08:00:50
【问题描述】:

我想从单词列表中选择一个随机单词,并可能将其显示为 *。我是全新的,在练习 python 后发现很难在球拍中创建代码。我试过的代码是-

(定义(随机词) (列表参考 词表 (length list-of-words (make-string (random 10) #*))))

那么-

(随机词) . .长度:arity 不匹配; 预期的参数数量与给定的数量不匹配 预期:1 给定:2

如果我写这个- (定义(随机词) (列表参考 词表 (模 (合同随机生成(或/c 精确非负整数?)) (长度的单词列表)))) 然后- 合同随机生成未定义。

我实际上只是在尝试随机代码,看看事情是否成功,但无论如何我都做不到。

【问题讨论】:

    标签: list scheme racket


    【解决方案1】:

    一种简单但不是很有效的方法是使用shuffle 并获取结果的第一个元素。

    (define (random-word lst) (first (shuffle lst)))
    

    更好的方法是使用generate a random number in the range [0, length of list),并使用list-ref 返回该元素。它最终不会比上面的版本长很多:

    (define (random-word lst) (list-ref lst (random (length lst))))
    

    【讨论】:

    • 好吧,我已经尝试过了,它正在工作。 (define (random-word) (list-ref list-of-words (random (length list-of-words)))) 。但是你能告诉我如何用*隐藏这个词吗?
    • 隐藏是什么意思?
    • 显示列表时(选择一个随机元素。依次显示列表中的每个元素,除了那个)或将列表中的它替换为*的字符串?
    【解决方案2】:

    我实际上只是在尝试随机代码,看看事情是否成功,但无论如何我都做不到。

    应该不惜一切代价避免所谓的Cargo cult programming。你在欺骗自己理解和合理的推理技巧来从根本上解决问题。

    (define (hide-random-elem ls)
      (let ((len (length ls)))
        (let loop ((ls ls) (ref (random 0 len)))
          (if (= ref 0)
              (cons '* (cdr ls))
              (cons (car ls) (loop (cdr ls) (- ref 1)))))))
    
    (define my-list '(a b c d e f g h i j k l m n o))
    
    (hide-random-elem my-list)
    
    '(a b c d e f g h i j k l * n o)
    
    (hide-random-elem (hide-random-elem (hide-random-elem my-list)))
    
    '(* b c d e f g h i * k l m n *) ; may or may not contain 3 *'s
    

    推荐阅读

    【讨论】:

    • 虽然我同意从 SO 在一个行业中复制和粘贴代码是一个真正的问题,但我在年轻时从编辑我的 Dragon32 和 C64 程序的部分内容中学到了很多东西,通常是从期刊上逐字记录的,然后我更改其中的一部分以查看结果发生了什么。 SICP 练习通常是修改示例以实现新功能。
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2015-01-26
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多