如何在Octave中模拟概率

How to simulate probability in Octave

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

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)。它在实践中似乎工作正常,但这是模拟千分之一错误机会的有效方法吗? randi 对 [1, 1000] 区间内所有整数的概率是否相同?

我想说这种解释的主要问题不一定是使用 randirand,或者这有多可靠,但事实上你总是保证 randirand =21=]永远不会信号中有一个以上的错误,这不是一个好的假设。

这不是 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 和 stuff。它们使这样的代码很难阅读,而实际上代码的逻辑很简单。一个月后,当您需要调试此代码时,您未来的自己将会感激不尽。