elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Simulacion de Comunicacion.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Simulacion de Comunicacion.  (Leído 3,413 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Simulacion de Comunicacion.
« en: 17 Noviembre 2018, 02:46 am »

El dia de hoy me pidieron ayuda con un trabajo escolar mega-urgente para ayer... como es costumbre  :silbar:

El programa trata de una simulación de comunicación, supuestamente solo les faltaba la parte que simula RUIDO en el canal de comunicación. Sin embargo realmente les faltaba todo.  ;-)

Se me hizo interesante ya que el código solicitado tenia su grado de Dificultad o por lo menos no es un trabajo que le puedan que dejar a alguien que apenas esta aprendiendo a programar.

Hize la parte del RUIDO prescindiendo de todo lo demas ya que se me hacia bastante didáctico.

El codigo lo hize de la forma mas simple y INEFICIENTE, pero trate de que fuera lo mas entendible posible, como hacerlo paso a paso.

Código
  1. #include<string.h> //para memset()
  2. #include<stdio.h> //printf
  3. #include<time.h> //para time auxilizar de rand()
  4. #include<stdlib.h> //Para rand() y srand()
  5.  
  6. int noise(char *data_stream,int len_data,unsigned char cuantos, unsigned char valor);
  7.  
  8. int main() {
  9. srand(time(NULL));
  10. char data[50] = {0};
  11. memset(data,'A',50); //Mensajes con puras AAAAAA....
  12. printf("Mensaje antes del ruido:\n%s\n",data);
  13. noise(data,50,10,1); //10 bits con ruido por cada 100 con valor a 1
  14. printf("Mensaje despues del ruido:\n%s\n",data);
  15. }
  16.  
  17. int noise(char *data_stream,int len_data,unsigned char cuantos, unsigned char valor) {
  18. printf("\nModulo Noise\n");
  19. /*
  20. Recorremos bit a bit y calcular si va a ser o no modificado en base a su probabilidad.
  21. Este método es en base a fuerza bruta y es ineficiente, deben de existir mejores, mas eficiente y de forma matemática, pero dado que se quiere un programa entendible se va a realizar de esta forma.
  22. */
  23. int i = 0;
  24. int index;
  25. int bit;
  26. int r;
  27. int cantidad_bits = len_data * 8;
  28. while(i < cantidad_bits) {
  29. r = rand() % 100; //Calculamos un numero  "r" aleatorio desde 0 a 99
  30. if(r < cuantos) { //Si el numero "r" es menor que "cuantos" significa que se saco la lotería y a ser sometido a un poco de ruido
  31. index = (int) (i / 8); ////calculamos el index del byte en el que estamos dado el bit
  32. //printf("El byte en el index %i va a ser editado\n",index); //Esta función puede ser descomentada para depurar y entender como funciona esta funcion
  33. bit = i % 8; // Aqui calculamos el bit que tiene que ser modificado en el byte marcado por el index previamente calculado
  34. if(valor) { //Si valor es 1, establecemos el bit en la posición "bit" a 1 del Byte dado por el index de la data
  35. data_stream[index] |= 1 << bit;
  36. }
  37. else { // Si es 0, hacemos el proceso opuesto y lo seteamos en 0 en bit en la posición "bit" del index de la data
  38. data_stream[index] &= ~(1 << bit);
  39. }
  40. }
  41. i++;
  42. }
  43. }
  44.  

El código trabaja directo sobre un apuntador que contiene los datos, pero podría trabajar byte por byte con sus respectivos cambios.

El programa funciona bien.



Parte de lo que me pedían era lo que esta en la siguiente imagen, pero realmente les faltaba todo....



« Última modificación: 17 Noviembre 2018, 16:40 pm por AlbertoBSD » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #1 en: 17 Noviembre 2018, 16:35 pm »

floor() es superfluo. La division de enteros da entero siempre.

Sugiero revisar la logica, pues el codigo no parece calzar con lo que se pide.

"cuantos" deberia indicar cuantos bits modificar cada 100 bits, pero el codigo modifica los primeros "cuantos" bits, no es lo mismo.

Dicho en numeros:
no es lo mismo modificar 3 bits aleatoriamente, que modificar los primeros 3 bits.


En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #2 en: 17 Noviembre 2018, 16:38 pm »

Eso esta mal lo que dices

Citar
"cuantos" deberia indicar cuantos bits modificar cada 100 bits, pero el codigo modifica los primeros "cuantos" bits, no es lo mismo.

El programa modifica bits al azar tal como lo muestra la imagen.



Si es cierto lo que dices del floor, lo cambiare, como tal lo mencione lo trate de hacer lo mas simple posible para que cualquier persona sin tantos conocomientos en C lo pueda entender.

Saludos
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #3 en: 17 Noviembre 2018, 16:41 pm »

Mira la descripcion que mandaste:

a) cuantos bits con ruido por cada 100 bits.

no es lo que haces.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #4 en: 17 Noviembre 2018, 16:47 pm »

Si es lo que hago.En base a probabilidad esta comentado el la siguiente parte del codigo

Código:
r = rand() % 100; //Calculamos un numero  "r" aleatorio desde 0 a 99
if(r < cuantos) { //Si el numero "r" es menor que "cuantos" significa que se saco la lotería y a ser sometido a un poco de ruido

Formas de hacerlo hay varias no te cierres solo a una, yo elegi por probabilidad.

Si r  un numero al azar de 0 a 99 es menor que que cuantos significa que le toco a ese bit ser modificado.

Si fuera cierto que solo modifico los primeros "cuantos" bits el mensaje solo tuviera las primeras letras A modificadas. pero es al azar.

Saludos
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #5 en: 17 Noviembre 2018, 16:58 pm »

Para entender lo que tu crees que estas haciendo, comparado con lo que se pide:

Si "cuantos" tiene valor 1, y tienes 100 bits en total.

cuantos bits tienes que modificar de esos 100 bits?

yo digo que tienes que modificar 1 de ellos, aleatoriamente elegido, y no es lo que haces.

El que muestres que los datos han sido modificados, no implica que las modificaciones estan bien hechas.



En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #6 en: 17 Noviembre 2018, 17:04 pm »

Imagina que solo nos mandan un BYTE, esto es 8 bits claro.

Y el ruido esta seateado a que 10 de cada 100 sean modificados.

Esto significa que en esos 8 bits puede ser que uno de ellos se modifique,  o puede que no este modificado, por que hay  2 bits que faltan para completar los 10, entonces como elegir si de esos 8 uno va a ser modificado o no?, pues yo prefiero algo al azar.

Formas de abordar el problema hay varias. Se que hay mejores y mas eficientes, pero en este ejemplo lo aborde de manera probabilistica y no determistica. Pienza en el ejemplo anterior de que nos manden solo 8 bits. como decides si uno de ellos se debe de modificar o no?

Citar
El que muestres que los datos han sido modificados, no implica que las modificaciones estan bien hechas.

Si claro, hace 2 post afirmabas que solo modificaba lo primeros cuantos bits.
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #7 en: 17 Noviembre 2018, 17:07 pm »

Repito, porque decidiste ignorar la pregunta:

Si "cuantos" tiene valor 1, y tienes 100 bits en total.

cuantos bits tienes que modificar de esos 100 bits?
cuantos modificas?
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #8 en: 17 Noviembre 2018, 17:09 pm »

En ese caso la probabilidad dicta que solo 1.

Y tu decidiste ignorar mi pregunta de solo 8 bits. Asi que estamos a mano.

Elegi al azar y por probabilidad ya que en mi opinion es la mejor forma de simular el ruido o interferencia en una comunoicacion. fuentes de ruido hay muchas y dependiendo de la fuente de ruido, no se, un motor en funcionamiente puede meter ruido a frecuencia constante, pero esto no es asi si viene de otro tipo de fuente, por ejemplo un coro circuito podria dar un patron de ruido muy inconstante. Un automovil pasando de vez en cuando tambien lo es.

Si es cierto, no hago lo que el programa pide, pero en lo que se refiere a la simulacion de ruido creo que no esta mal y si es por probabilidad es muy cercano a lo que el programa esta pidiendo.

Tambien lo hize asi para poder solventar el problema de eligir si modificar o no uno o alguno de los 8 bits del ejemplo mas sencillo.

Te mandan solo 8 bits y el ruido esta seteado a solo 1 de cada 100, ¿Como elegir si determinado bit debe de ser modificado o no?

Confio en que la funcion de probabilidad va a ser algo muy parecido a lo que pide, si aun que no sea lo mismo.



En algun punto el programa pide que el modulo se incluya en el canal de comunicación. He reescrito la funcion de ruido par que solo trabaje un BYTE a la vez.



Código
  1. #include<string.h>
  2. #include<stdio.h>
  3. #include<time.h>
  4. #include<stdlib.h>
  5.  
  6. #define LEN 12
  7.  
  8. char noise(char byte,unsigned char cuantos, unsigned char valor);
  9.  
  10. int main() {
  11. srand(time(NULL));
  12. char data[LEN+1] = {0}; //LEN + uno por aquello del byte terminacion de cadena.
  13. int i = 0;
  14. memset(data,'A',LEN);
  15. printf("Mensaje antes del ruido:\n%s\n",data);
  16. while(i < LEN) {
  17. data[i] = noise(data[i],1,1);
  18. i++;
  19. }
  20. printf("Mensaje despues del ruido:\n%s\n",data);
  21. }
  22.  
  23.  
  24.  
  25. char noise(char byte,unsigned char cuantos, unsigned char valor) {
  26. int i = 0;
  27. while(i < 8) {
  28. if((rand() % 100) < cuantos) {
  29. if(valor) {
  30. byte |= 1 << i;
  31. }
  32. else {
  33. byte &= ~(1 << i);
  34. }
  35. }
  36. i++;
  37. }
  38. return byte;
  39. }



Para demostrar que la aproximación por probabilidad es muy aproximada a lo que se esta pidiendo he vuelto a modificar el programa, indicando solamente el Ratio de bits modificados contra recibidos.

Salida el programa con 10 millones de BYTES de datos Enviados

Código:

Valores enviados 80000000, modificados 800351, ratio 0.010004
C:\codigos>comunicacion.exe
Valores enviados 80000000, modificados 799396, ratio 0.009992

Si vien vemos es casi siempre un valor cercano al 1 por ciento

Codigo

Código
  1. #include<string.h>
  2. #include<stdio.h>
  3. #include<time.h>
  4. #include<stdlib.h>
  5.  
  6. #define LEN 12
  7.  
  8. char noise(char byte,unsigned char cuantos, unsigned char valor);
  9.  
  10. unsigned int recibidos = 0;
  11. unsigned int modificados = 0;
  12.  
  13. int main() {
  14. unsigned int i = 0;
  15. srand(time(NULL));
  16. while(i < 10000000) {
  17. noise('A',1,1);
  18. i++;
  19. }
  20. printf("Valores enviados %u, modificados %u, ratio %f",recibidos,modificados,(float)modificados/(float)recibidos);
  21. }
  22.  
  23. char noise(char byte,unsigned char cuantos, unsigned char valor) {
  24. int i = 0;
  25. recibidos+= 8;
  26. while(i < 8) {
  27. if((rand() % 100) < cuantos) {
  28. modificados++;
  29. if(valor) {
  30. byte |= 1 << i;
  31. }
  32. else {
  33. byte &= ~(1 << i);
  34. }
  35. }
  36. i++;
  37. }
  38. return byte;
  39. }
  40.  


Saludos.
« Última modificación: 17 Noviembre 2018, 19:13 pm por AlbertoBSD » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Simulacion de Comunicacion.
« Respuesta #9 en: 17 Noviembre 2018, 19:46 pm »

La manera de probar que el codigo original es cercano a lo que se pide no esta bien.
El test solo muestra que la funcion de probabilidad te sirve, no que su uso esta bien,

Recuerda que tienes que modificar a lo mas <cuantos> bits por cada 100 de ellos.
Esto no te lo da la solucion propuesta, porque usas la probabilidad en tamanos distintos de 100 (aunque usas el 100 para controlar si aplicar el cambio o no al bit visitado), por lo que es bien posible que se modifiquen mas que <cuantos> bits, como te ocurre. Contabilizar los cambios para corregir esto solamente va a tener bias favoreciendo a los primeros cambios.

Si modificas tu funcion noise original, para avanzar a traves del conjunto de caracteres cada 100 bits, aun usando la funcion de probabilidad, tu resultado sera mas cercano al correcto, nunca modificando mas de los bits que son necesarios.

Mucha teoria, lo que indico, usando parte de lo que enviaste, corrigiendo de acuerdo a lo que propongo.

Código
  1. int noise(char *data_stream,int len_data,unsigned char cuantos, unsigned char valor) {
  2. int index;
  3. int bit;
  4. int offset;
  5. int bit_offset;
  6. int bits_modificados;
  7. int cantidad_bits = len_data * 8;
  8.  
  9. for(int offset = 0; offset < cantidad_bits; offset += 100) {
  10.     for( bits_modificados = cuantos; bits_modificados > 0; bits_modificados--) {
  11.     bit_offset = rand() % 100 + offset;
  12.     if( bit_offset > cantidad_bits) {
  13.        continue;
  14. }
  15.     index = bit_offset / 8;
  16.     bit = bit_offset % 8;
  17.     if(valor) {
  18.   data_stream[index] |= 1 << bit;
  19. } else {
  20.                    data_stream[index] &= ~(1 << bit);
  21. }
  22.       }
  23. }
  24. }


Lo pruebas asi:

Código
  1. #define LARGO 100 // 1 cambio cada 100 bits seran 8 cambios en total (a lo mas).
  2.  
  3. int main() {
  4. srand(time(NULL));
  5. char data[LARGO+1] = {0};
  6. for( int test = 0; test < 100; test++ ) {
  7.           memset(data,0,LARGO);
  8.   noise(data,LARGO,1,1);
  9.           // lo correcto es contar los bits modificados, pero si tenemos suerte
  10.           // solo se ha modificado 1 bit por caracter
  11.   int count = 0;
  12.   for(int i = 0; i < LARGO; i++) {
  13.       if(data[i] != 0) {
  14.           count++;
  15.       }
  16.   }
  17.   printf("Mensaje despues del ruido: %d modificaciones\n", count);
  18. }
  19. }
  20.  
  21.  
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Simulación de consola en VB
Programación Visual Basic
aaronduran2 4 3,582 Último mensaje 12 Junio 2008, 20:29 pm
por aaronduran2
Simulacion Banco
Programación C/C++
Gerik 2 10,789 Último mensaje 4 Octubre 2010, 06:44 am
por leogtz
Juego de simulacion
Juegos y Consolas
gamer12 1 2,388 Último mensaje 6 Noviembre 2010, 18:57 pm
por Castiblanco
hilos simulacion
Java
bengy 3 3,008 Último mensaje 20 Julio 2012, 07:06 am
por leogtz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines