【问题标题】:In Scheme, how do you do probability?在Scheme中,你如何做概率?
【发布时间】:2013-03-04 22:36:24
【问题描述】:

如果我有一个像 sub1 和一个列表这样的过程,如何将概率值应用于列表的每个元素?

类似这样的:(blahblah sub1 '(1 1 1 1) 0.5)

我希望它以例如 0.5 的概率将 sub1 应用于每个元素。但是,我不知道该怎么做。我想我必须随机使用一些方法,但我不确定如何。帮忙?

这是我到目前为止所拥有的。它根本不起作用。

(define map-random
  (lambda (proc ls p)
    (map
      (lambda (x)
        (if (null? ls) '()
            (proc x (+ x (random p))))) ls)))

【问题讨论】:

  • 所以你的意思是,你想要map 一个具有函数的序列充当要么“sub1”或基于@987654323 的identity function @?也就是说,考虑一个函数,它接受 x 并根据随机值返回 sub1(x) 或 x。
  • 是的。这就是我想要做的。
  • 那就去做吧——它要么工作要么不工作。但即使它不起作用,发布尝试的代码以及它如何“不起作用”也会为问题提供更好的基础。
  • 考虑这个:“如果随机在 [0, 1) 范围内
  • 好吧,它像十进制数字一样返回,这是不对的。如果 proc 是加 1 并且列表全是零,那么它应该返回 1 和 0,对吧?

标签: random scheme probability


【解决方案1】:

也许你打算写这样的东西:

(define map-random
  (lambda (proc ls p)
    (map (lambda (e)
           (if (<= (random) p)
               (proc e)
               e))
         ls)))

请注意,map 负责遍历输入列表并构建输出列表,您只需决定如何处理每个元素 - 在这种情况下,这意味着是否将给定的过程应用于一个元素或根据随机值单独保留该元素 - 如果该值在给定概率内,则应用该程序,如果不使用相同的元素。它按预期工作:

(map-random sub1 '(1 1 1 1) 0.5)
=> '(1 1 0 1) ; a possible output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2021-10-10
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多