2016-11-18 67 views
0

我想在球拍中製作更復雜的隨機功能。球拍中的隨機功能(更復雜)

該函數將具有兩個輸入列表作爲參數(假設列表將具有相同的長度):

  • 一個將是元件它可以返回

  • 另將用於概率。讓我清楚地表明,如果列表是'(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」的概率在它們之間是相同的。

謝謝!

+2

我投票關閉這個問題進行摘主題,因爲它似乎是功課,海報還沒有顯示已經嘗試過的東西,或者他/她得到了多少。 –

+0

@JohnClements我對這類問題的一般解決方法是回答經驗豐富的Schemer會回答的方式,使用我們通常會解決的任何SRFI或模塊。然後,OP將被迫實際調整代碼,以使其教授要求他們使用的語言的任何受限子集。只要他們真的在做那些工作,而不是將它卸載給其他人,我還可以。 –

+0

@John Clements謝謝你的答案。我努力學習Schemer。我知道C(不是專家),但我很難學習Schemer。我有很多文檔/書籍,例如:1)「The Littler Schemer」2 )「關於算法語言方案的修訂報告」3)「在自己的日子裏教自己的計劃」。但是我讀不到足夠的知識,我需要一些例子來「玩」並通過迭代學習。在這個意義上「Littler Schemer」似乎對基礎很好,但現在我正在尋找更復雜的東西來改善。 [繼續] –

回答

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))