微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Octave 中模拟概率

如何解决如何在 Octave 中模拟概率

我的任务是用二进制消息模拟一个信号,它通过一个噪声通道,误码率为 1000 分之一。这是我所做的。

function [r f] = generateBitError(d,ber)
  flag = false;
  if(randi(round(ber^(-1))) == 1)
    i = randi(length(d));
    d(i) = not(d(i));
    flag = true;
  endif
  
  r = d;
  f = flag;
endfunction

d 是一个矩阵,其单元格包含二进制数字,ber 通常取值 10^(-3)。它在实践中似乎工作正常,但这是模拟千分之一错误机会的有效方法吗?对于区间 [1,1000] 中的所有整数,randi 是否具有相同的概率?

解决方法

我想说这个解释的主要问题不一定是使用randi vs rand,或者这有多可靠,而是你总是保证会有信号中的错误永远不会超过一个,这不是一个好的假设。

这不是 1:1000 的错误率通常意味着什么。这意味着 每个 位都有 1:1000 的机会被翻转。 IE。每个位都经过伯努利试验,伯努利参数为 0.001。在整个信号中翻转 2 位或更多位应该完全可能;它不应该是非常可能

所以我会改写成这样:

function [ OutputSignal,HasFlipped ] = apply_noise( InputSignal,mu = 0.001 )
   % InputSignal: A horizontal vector of 0 or 1 values
   % mu: Bernoulli parameter denoting probability of error event
   N = length( InputSignal );
   ErrorPositions = rand( 1,N ) <= mu;
   OutputSignal = InputSignal;
   OutputSignal( ErrorPositions ) = ~OutputSignal( ErrorPositions );
   HasFlipped = any( ErrorPositions );
end

另外,避免使用无意义的变量名,如 r、f、d、ber 等。它们使这样的代码很难阅读,而实际上代码的逻辑很简单。一个月后,当您需要调试此代码时,您未来的自己将感激涕零。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。