Racket中的随机功能(甚至更复杂)

时间:2016-11-18 16:34:40

标签: function random racket

我想在Racket中制作一个更复杂的随机函数。

该函数将有两个输入列表作为参数(假设列表具有相同的长度):

  • 其中一个元素可以归还

  • 另一个是概率。让我明确一点,如果列表是'(1 1 2),获得第一个元素的概率将与第二个元素相同,但第三个元素的概率将是第一个和第二个元素的两倍。如果列表是'(1 2 4),则第二个元素的概率将是第一个元素的两倍,但是第三个元素的一半。

所以如果我们有输入参数'(e t k)和'(1 2 3)。获得“t”的概率将是“e”的两倍。获得“k”的概率将是“e”的三倍。

如果我们有输入参数'(k u y t)和'(1 1 2 1)。获得“y”的概率将是“k”,“u”和“t”的两倍。获得“k”,“u”和“t”的概率在它们之间是相同的。

谢谢!

1 个答案:

答案 0 :(得分:0)

假设频率都是整数:

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

(define (random-item/frequencies lst freqs)
  (random-item (append-map make-list freqs lst)))

如果频率涉及非整数量,事情就会变得有点棘手:

(define (random-item/frequencies lst freqs)
  ; rcfs = reversed cumulative frequencies
  (define rcfs (foldl (lambda (e r) (cons (+ e (car r)) r)) '(0) freqs))
  (define threshold (* (random) (car rcfs)))
  (for/first ([item (in-list lst)]
              [cf (in-list (cdr (reverse rcfs)))]
              #:when (> cf threshold))
    item))