我想在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”的概率在它们之间是相同的。
谢谢!
答案 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))