package rescuecore2.standard.kernel.comms;
import java.util.Random;
import rescuecore2.standard.messages.AKSpeak;
/**
Static noise flips bits in the message with some probability.
*/
public class StaticNoise implements Noise {
private static final int BITS = 8;
private double p;
private Random random;
/**
Construct a StaticNoise object that will flip bits with some probability.
@param p The probability of flipping a bit.
@param random The RNG to use.
*/
public StaticNoise(double p, Random random) {
this.p = p;
this.random = random;
}
@Override
public AKSpeak applyNoise(AKSpeak message) {
byte[] data = message.getContent();
for (int i = 0; i < data.length; ++i) {
for (int j = 0; j < BITS; ++j) {
if (random.nextDouble() < p) {
// Flip this bit
data[i] = (byte)(data[i] ^ (1 << j));
}
}
}
return new AKSpeak(message.getAgentID(), message.getTime(), message.getChannel(), data);
}
}