Lo unico que pruebas, al menos con el programa de test que pusiste previamente, es que la funcion rand() tiene un comportamiento como el que esperas, o sea, que 1 de cada 100 elementos sea elegido, pero esto no implica que 1 de cada 100 elementos tu eligiras de los primeros 100 bits.
Si le dieras a la funcion rand() los 100 primeros elementos, esta elegiria solo 1 de alli, pero tu no haces esto, le dices a la funcion rand() que eliga uno por uno, cada bit, con probabilidad 1/100. Con ello, tu programa podria elegir varios bits en el camino, y es esto efectivamente lo que ocurre. Varias veces rand() elige alguno de los bits. Aunque rand() este bien, eso no implica que cualquier uso de rand() hara que los resultados esten correctos. No importa cuantas veces lo ejecutes.
El no generar elecciones ya hechas se puede resolver, por ejemplo, manteniendo lo disponible. En vez de guardar lo elegido y comparar si ya ha sido elegido antes., por ejemplo asi:
Si le dieras a la funcion rand() los 100 primeros elementos, esta elegiria solo 1 de alli, pero tu no haces esto, le dices a la funcion rand() que eliga uno por uno, cada bit, con probabilidad 1/100. Con ello, tu programa podria elegir varios bits en el camino, y es esto efectivamente lo que ocurre. Varias veces rand() elige alguno de los bits. Aunque rand() este bien, eso no implica que cualquier uso de rand() hara que los resultados esten correctos. No importa cuantas veces lo ejecutes.
El no generar elecciones ya hechas se puede resolver, por ejemplo, manteniendo lo disponible. En vez de guardar lo elegido y comparar si ya ha sido elegido antes., por ejemplo asi:
Código (c) [Seleccionar]
int noise(char * data_stream, int len_data, unsigned char cuantos, unsigned char valor) {
int index;
int bit;
int cantidad_bits = len_data * 8;
int disponible[100];
for (int offset = 0; offset < cantidad_bits; offset += 100) {
for (int i = 0; i < 100; i++) disponible[i] = i;
for (int bits_modificados = 0; bits_modificados < cuantos; bits_modificados++) {
int r = rand() % (100 - bits_modificados);
int bit_offset = disponible[r] + offset;
disponible[r] = disponible[99 - bits_modificados];
if (bit_offset >= cantidad_bits) {
continue;
}
index = bit_offset / 8;
bit = bit_offset % 8;
if (valor) {
data_stream[index] |= 1 << bit;
} else {
data_stream[index] &= ~(1 << bit);
}
}
}
}