Scheme:以特定速率导致随机错误的过程

时间:2013-10-03 17:24:17

标签: scheme

这是我的最后一个家庭作业问题,它也使导师难过。老实说,我不知道该去哪儿,并且在学校里已经筋疲力尽了。问题我:

定义一个最常见的过程,它需要多次重复,一个数字速率,以及一个0和1的原始列表。该程序应首先产生原始列表的重复副本。然后,它应该通过平均每个速率元素引入随机误差来模拟噪声信道上每个副本的传输。最后,它应检查最常见值列表是否与原始输入列表匹配。

我已经准备好了一个写出来的功能,它采用了最常见的元素(非常感谢奥斯卡的那个!)所以我真的需要一些帮助来解决这个问题。我知道你想要随机使用并具有该随机的特定比率。如果错误发生,我知道你想要将0更改为1,将1更改为0.我也准备好了一个函数,它将重复原始的重复给定的数量,这是我到目前为止所有的这个问题在这里给出:

(define repeated-list 
 (lambda (rep org)
  (cond
   [(equal? rep 0) '()]
   [else (cons org (repeated-list (sub1 rep) org))])))

(define noisy-channel
 (lambda (rep-org rate)
  (cond
   [(null? rep-org) '()]
   [else (cons (noisy-helper (car rep-org) rate) (noisy-channel (cdr rep-org) 
    rate))])))


(define noisy-helper
 (lambda (rep-org rate)
  (cond
    [(null? rep-org) '()]
     [**(here is where I'm stuck)**])))


(define test-most-common
 (lambda (rep rate org)
  (equal? (most-common(noisy-channel (repeated-list rep org) rate)) org)))

我记下了我被卡住的地方。在那一点上,我相信我需要做随机函数和一些数学(可能?)来实现位实际翻转的位置。

2 个答案:

答案 0 :(得分:0)

首先,您的重复组织并不像您所描述的那样行事。它重复单个元素,而不是列表。您实际上需要一个辅助函数来生成重复列表,或使用追加函数:

(define repeated-list 
  (lambda (rep org)
    (cond
      [(equal? rep 0) '()]
      [else (append org (repeated-list (sub1 rep) org))])))

其次,如果你想编写一个以一定概率改变一点的函数:

(define change-list
  (lambda (mypoorlist rate)
    (cond
      [(empty? mypoorlist) '()]
      ;; if rate exceeds a random value from 0..1
      ;; then toggle the first value (1 - first value)
      [(> rate (random)) (cons (- 1 (car mypoorlist)) (change-list (cdr mypoorlist) rate))]
      ;; otherwise just keep going
      [else (cons (car mypoorlist) (change-list (cdr mypoorlist) rate))]
     )))

对于最常见的,只需写出一个函数来递归地找到它。如果你正在处理0/1列表,一个简单的方法就是添加整个事物并查看它是否大于或小于length / 2.

你的问题很奇怪,如果你随机改变数值,那么你不能保证最常见的元素不会改变。如果你有足够高的比率(超过50%),它甚至变得不太可能。

也许如果您发布完整的问题,我们可以为您提供更多帮助。

答案 1 :(得分:0)

如果有人对此感到好奇,我解决了这个问题,并将展示我在家庭作业中如何提交它的代码。我没有在最终函数中执行递归,因此它检查每个嵌套列表,但这很容易解决。

(define repeated-list 
 (lambda (rep org)
  (cond
   [(equal? rep 0) '()]
   [else (cons org (repeated-list (sub1 rep) org))])))

(define noisy-helper
 (lambda (rep-org rate)
  (cond
      [(null? rep-org) '()]
      [(< (random 100) rate)
       (cond
         [(equal? (car rep-org) 0) (cons 1 (noisy-helper (cdr rep-org) rate)
                                         )]
         [(equal? (car rep-org) 1) (cons 0 (noisy-helper (cdr rep-org) rate)
                                         )])]
      [else (cons (car rep-org) (noisy-helper (cdr rep-org) rate))])))


(define noisy-channel
 (lambda (rep-org rate)
   (cond
    [(null? rep-org) '()]
    [else (cons (noisy-helper (car rep-org) rate) (noisy-channel (cdr rep-org)
                                                               rate))])))

(define test-most-common
 (lambda (rep rate org)
   (equal? (most-common org)(most-common(car (noisy-channel 
                                           (repeated-list rep org) 
                                           rate))))))