Simulacion de Comunicacion.

Iniciado por AlbertoBSD, 17 Noviembre 2018, 02:46 AM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

#10
Voy a revisarlo con calma.

Solo me queda comentar que la forma en la que estas contando los cambios no contempla si un byte determinado fue modificado en mas de 1 bit. Es decir si por azar cambias mas de 2 bits en un solo byte, al final la forma en la que lo estas contando solo contabilizada un solo cambio, cuando realmente puede ser mas de 1.

Voy a cambiar esa parte y hacer que noise devuelva la cantidad de bits que modifico.

Saludos.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

CalgaryCorpus

Estoy de acuerdo que la cuenta se puede mejorar, lo indique también en el comentario que acompaña. Gracias!
Aqui mi perfil en LinkedIn, invitame un cafe aqui

AlbertoBSD

Si bien es cierto que el codigo que posteaste modifica el stream de datos exactamente "cuantos" veces bits por cada 100.
Encontre un detalle. Incremente la precuencia a 10 veces por cada 100, y en ocasiones escribe el mismo bit varias veces, esto obvio por la función al azar.



Con lo cual la solucion tambien falla, se podria solucionar llevando el registro de cuales bits ya fueron modificados y en caso de caer el mismo bit volver a generar un numero al azar.


Volviendo al código de que la función Noise solo reciba de 8 bits en 8 bits. La aproximación sigue siendo buena en el largo plazo, para un stream de 10 millones de bytes el proceso solo modifica un numero paroximado de "Cuantos" % por cada 100.

Hice esta prueba 1000 veces (10 millones de bytes)  y dejo aqui los resultados para cuantos = 1, si bien es cierto que el resultado indica que la mayoría de las veces escribe un poco mas del 1% est esto ejemplo 1.0009% etc..., el problema no radica en error del código, sino en que al realizar modulo de un  numero aleatorio entero, los números arrojados por modulo van a favorecer a los números pequeños mas pequeños, por lo cual son mas veces en las que cae un total de modificaciones mayores al 1%  que las que veces que es menor al 1%

801872/80000000: 0.010023
800686/80000000: 0.010009
801186/80000000: 0.010015
801434/80000000: 0.010018
798510/80000000: 0.009981
802066/80000000: 0.010026
800646/80000000: 0.010008
800404/80000000: 0.010005
800509/80000000: 0.010006
799722/80000000: 0.009997
800401/80000000: 0.010005
802419/80000000: 0.010030
801342/80000000: 0.010017
799240/80000000: 0.009990
800074/80000000: 0.010001
801603/80000000: 0.010020
801204/80000000: 0.010015
800968/80000000: 0.010012
798772/80000000: 0.009985
800586/80000000: 0.010007
801397/80000000: 0.010017
801388/80000000: 0.010017
801498/80000000: 0.010019
799636/80000000: 0.009995
801361/80000000: 0.010017
799974/80000000: 0.010000
802682/80000000: 0.010034
801124/80000000: 0.010014
800626/80000000: 0.010008
801999/80000000: 0.010025
800699/80000000: 0.010009
798801/80000000: 0.009985
802041/80000000: 0.010026
800655/80000000: 0.010008
800516/80000000: 0.010006
800127/80000000: 0.010002
799840/80000000: 0.009998
800798/80000000: 0.010010
802404/80000000: 0.010030
800962/80000000: 0.010012
799079/80000000: 0.009988
800190/80000000: 0.010002
802071/80000000: 0.010026
801185/80000000: 0.010015
801056/80000000: 0.010013
798745/80000000: 0.009984
800413/80000000: 0.010005
801697/80000000: 0.010021
800700/80000000: 0.010009
801438/80000000: 0.010018
799661/80000000: 0.009996
800943/80000000: 0.010012
801018/80000000: 0.010013
802110/80000000: 0.010026
801044/80000000: 0.010013
801069/80000000: 0.010013
801805/80000000: 0.010023
800529/80000000: 0.010007
799581/80000000: 0.009995
801568/80000000: 0.010020
800177/80000000: 0.010002
800500/80000000: 0.010006
800400/80000000: 0.010005
799989/80000000: 0.010000
801018/80000000: 0.010013
801732/80000000: 0.010022
800914/80000000: 0.010011
799528/80000000: 0.009994
800926/80000000: 0.010012
801257/80000000: 0.010016
801388/80000000: 0.010017
800303/80000000: 0.010004
799101/80000000: 0.009989
800431/80000000: 0.010005
802019/80000000: 0.010025
800509/80000000: 0.010006
801267/80000000: 0.010016
799827/80000000: 0.009998
800949/80000000: 0.010012
801384/80000000: 0.010017
801989/80000000: 0.010025
801143/80000000: 0.010014
800858/80000000: 0.010011
801373/80000000: 0.010017
800915/80000000: 0.010011
799775/80000000: 0.009997
801985/80000000: 0.010025
800055/80000000: 0.010001
799877/80000000: 0.009998
799569/80000000: 0.009995
800713/80000000: 0.010009
801717/80000000: 0.010021
801376/80000000: 0.010017
801070/80000000: 0.010013
798755/80000000: 0.009984
801968/80000000: 0.010025
801261/80000000: 0.010016
801238/80000000: 0.010015
799939/80000000: 0.009999
799197/80000000: 0.009990
800861/80000000: 0.010011
801462/80000000: 0.010018
800967/80000000: 0.010012
801090/80000000: 0.010014
800326/80000000: 0.010004
800272/80000000: 0.010003
801724/80000000: 0.010022
801653/80000000: 0.010021
801532/80000000: 0.010019
800261/80000000: 0.010003
801963/80000000: 0.010025
799778/80000000: 0.009997
800801/80000000: 0.010010
801649/80000000: 0.010021
800511/80000000: 0.010006
799377/80000000: 0.009992
799875/80000000: 0.009998
800583/80000000: 0.010007
801719/80000000: 0.010021
801188/80000000: 0.010015
800559/80000000: 0.010007
799279/80000000: 0.009991
801975/80000000: 0.010025
801776/80000000: 0.010022
800353/80000000: 0.010004
800209/80000000: 0.010003
798950/80000000: 0.009987
801293/80000000: 0.010016
801474/80000000: 0.010018
800916/80000000: 0.010011
801147/80000000: 0.010014
800287/80000000: 0.010004
800628/80000000: 0.010008
801225/80000000: 0.010015
802154/80000000: 0.010027
801185/80000000: 0.010015
800306/80000000: 0.010004
801678/80000000: 0.010021
799658/80000000: 0.009996
801259/80000000: 0.010016
801564/80000000: 0.010020
799898/80000000: 0.009999
799866/80000000: 0.009998
799983/80000000: 0.010000
800596/80000000: 0.010007
802369/80000000: 0.010030
800423/80000000: 0.010005
800433/80000000: 0.010005
799412/80000000: 0.009993
801660/80000000: 0.010021
801684/80000000: 0.010021
800790/80000000: 0.010010
799563/80000000: 0.009995
799565/80000000: 0.009995
801129/80000000: 0.010014
801293/80000000: 0.010016
801535/80000000: 0.010019
800423/80000000: 0.010005
801201/80000000: 0.010015
800447/80000000: 0.010006
801478/80000000: 0.010018
802006/80000000: 0.010025
801066/80000000: 0.010013
800642/80000000: 0.010008
801202/80000000: 0.010015
799373/80000000: 0.009992
801219/80000000: 0.010015
801008/80000000: 0.010013
800482/80000000: 0.010006
800229/80000000: 0.010003
800057/80000000: 0.010001
800341/80000000: 0.010004
802365/80000000: 0.010030
801192/80000000: 0.010015
799544/80000000: 0.009994
799810/80000000: 0.009998
802012/80000000: 0.010025
800900/80000000: 0.010011
800904/80000000: 0.010011
798985/80000000: 0.009987
800312/80000000: 0.010004
801321/80000000: 0.010017
801691/80000000: 0.010021
801527/80000000: 0.010019
799359/80000000: 0.009992
801560/80000000: 0.010020
799970/80000000: 0.010000
802288/80000000: 0.010029
801383/80000000: 0.010017
800853/80000000: 0.010011
801587/80000000: 0.010020
800985/80000000: 0.010012
798920/80000000: 0.009987
802182/80000000: 0.010027
800557/80000000: 0.010007
800181/80000000: 0.010002
800637/80000000: 0.010008
799569/80000000: 0.009995
800515/80000000: 0.010006
802352/80000000: 0.010029
801326/80000000: 0.010017
798818/80000000: 0.009985
800459/80000000: 0.010006
801850/80000000: 0.010023
801540/80000000: 0.010019
800665/80000000: 0.010008
798514/80000000: 0.009981
800782/80000000: 0.010010
801569/80000000: 0.010020
800724/80000000: 0.010009
801799/80000000: 0.010022
799559/80000000: 0.009994
800986/80000000: 0.010012
800538/80000000: 0.010007
802341/80000000: 0.010029
800994/80000000: 0.010012
801334/80000000: 0.010017
801662/80000000: 0.010021
800750/80000000: 0.010009
799223/80000000: 0.009990
801386/80000000: 0.010017
800510/80000000: 0.010006
800560/80000000: 0.010007
800159/80000000: 0.010002
800365/80000000: 0.010005
800911/80000000: 0.010011
801838/80000000: 0.010023
800889/80000000: 0.010011
799027/80000000: 0.009988
800932/80000000: 0.010012
801580/80000000: 0.010020
801310/80000000: 0.010016
800571/80000000: 0.010007
798814/80000000: 0.009985
800345/80000000: 0.010004
802328/80000000: 0.010029
800357/80000000: 0.010004
801443/80000000: 0.010018
799523/80000000: 0.009994
800929/80000000: 0.010012
801506/80000000: 0.010019
801789/80000000: 0.010022
801058/80000000: 0.010013
801471/80000000: 0.010018
801133/80000000: 0.010014
800858/80000000: 0.010011
799305/80000000: 0.009991
802416/80000000: 0.010030
799759/80000000: 0.009997
800163/80000000: 0.010002
800000/80000000: 0.010000
800462/80000000: 0.010006
801277/80000000: 0.010016
801614/80000000: 0.010020
801123/80000000: 0.010014
799016/80000000: 0.009988
801480/80000000: 0.010019
801357/80000000: 0.010017
801253/80000000: 0.010016
800346/80000000: 0.010004
798859/80000000: 0.009986
800568/80000000: 0.010007
802114/80000000: 0.010026
800586/80000000: 0.010007
801286/80000000: 0.010016
799835/80000000: 0.009998
800572/80000000: 0.010007
801601/80000000: 0.010020
801770/80000000: 0.010022
801676/80000000: 0.010021
800085/80000000: 0.010001
802200/80000000: 0.010028
799997/80000000: 0.010000
800324/80000000: 0.010004
801692/80000000: 0.010021
800684/80000000: 0.010009
799309/80000000: 0.009991
799564/80000000: 0.009995
800724/80000000: 0.010009
801609/80000000: 0.010020
801366/80000000: 0.010017
801189/80000000: 0.010015
798736/80000000: 0.009984
802003/80000000: 0.010025
801420/80000000: 0.010018
800751/80000000: 0.010009
799949/80000000: 0.009999
799247/80000000: 0.009991
801261/80000000: 0.010016
801276/80000000: 0.010016
801043/80000000: 0.010013
801074/80000000: 0.010013
800697/80000000: 0.010009
800087/80000000: 0.010001
801486/80000000: 0.010019
801871/80000000: 0.010023
801259/80000000: 0.010016
800168/80000000: 0.010002
802025/80000000: 0.010025
799810/80000000: 0.009998
800803/80000000: 0.010010
801883/80000000: 0.010024
800055/80000000: 0.010001
799534/80000000: 0.009994
799866/80000000: 0.009998
800584/80000000: 0.010007
802571/80000000: 0.010032
800743/80000000: 0.010009
800273/80000000: 0.010003
799467/80000000: 0.009993
801448/80000000: 0.010018
801783/80000000: 0.010022
800705/80000000: 0.010009
799860/80000000: 0.009998
799285/80000000: 0.009991
801289/80000000: 0.010016
801230/80000000: 0.010015
801498/80000000: 0.010019
800231/80000000: 0.010003
801094/80000000: 0.010014
800415/80000000: 0.010005
801678/80000000: 0.010021
801608/80000000: 0.010020
801419/80000000: 0.010018
800738/80000000: 0.010009
801201/80000000: 0.010015
798888/80000000: 0.009986
801914/80000000: 0.010024
801154/80000000: 0.010014
800327/80000000: 0.010004
799901/80000000: 0.009999
799998/80000000: 0.010000
800706/80000000: 0.010009
801969/80000000: 0.010025
801249/80000000: 0.010016
799751/80000000: 0.009997
799519/80000000: 0.009994
802092/80000000: 0.010026
801120/80000000: 0.010014
800908/80000000: 0.010011
799306/80000000: 0.009991
799922/80000000: 0.009999
801176/80000000: 0.010015
801279/80000000: 0.010016
801711/80000000: 0.010021
800074/80000000: 0.010001
801219/80000000: 0.010015
800126/80000000: 0.010002
802104/80000000: 0.010026
801699/80000000: 0.010021
800667/80000000: 0.010008
801261/80000000: 0.010016
801421/80000000: 0.010018
798713/80000000: 0.009984
802275/80000000: 0.010028
800092/80000000: 0.010001
800555/80000000: 0.010007
800684/80000000: 0.010009
799421/80000000: 0.009993
800515/80000000: 0.010006
802395/80000000: 0.010030
801340/80000000: 0.010017
798905/80000000: 0.009986
800578/80000000: 0.010007
801514/80000000: 0.010019
801245/80000000: 0.010016
801044/80000000: 0.010013
798686/80000000: 0.009984
800489/80000000: 0.010006
801542/80000000: 0.010019
801056/80000000: 0.010013
801703/80000000: 0.010021
799578/80000000: 0.009995
801133/80000000: 0.010014
800223/80000000: 0.010003
802723/80000000: 0.010034
801118/80000000: 0.010014
800662/80000000: 0.010008
802043/80000000: 0.010026
800672/80000000: 0.010008
798762/80000000: 0.009985
801842/80000000: 0.010023
800485/80000000: 0.010006
800885/80000000: 0.010011
799958/80000000: 0.009999
799953/80000000: 0.009999
801096/80000000: 0.010014
802134/80000000: 0.010027
800842/80000000: 0.010011
799052/80000000: 0.009988
800724/80000000: 0.010009
801672/80000000: 0.010021
801302/80000000: 0.010016
800895/80000000: 0.010011
798439/80000000: 0.009980
800732/80000000: 0.010009
801654/80000000: 0.010021
800631/80000000: 0.010008
801500/80000000: 0.010019
799711/80000000: 0.009996
800825/80000000: 0.010010
801305/80000000: 0.010016
802209/80000000: 0.010028
800840/80000000: 0.010011
801045/80000000: 0.010013
801584/80000000: 0.010020
800859/80000000: 0.010011
799325/80000000: 0.009992
801991/80000000: 0.010025
799981/80000000: 0.010000
800376/80000000: 0.010005
800480/80000000: 0.010006
799725/80000000: 0.009997
801225/80000000: 0.010015
801556/80000000: 0.010019
800999/80000000: 0.010012
799500/80000000: 0.009994
801324/80000000: 0.010017
800930/80000000: 0.010012
801621/80000000: 0.010020
800389/80000000: 0.010005
798938/80000000: 0.009987
800626/80000000: 0.010008
801695/80000000: 0.010021
800547/80000000: 0.010007
801438/80000000: 0.010018
799812/80000000: 0.009998
800821/80000000: 0.010010
801456/80000000: 0.010018
801967/80000000: 0.010025
801287/80000000: 0.010016
800489/80000000: 0.010006
801724/80000000: 0.010022
800681/80000000: 0.010009
800066/80000000: 0.010001
801732/80000000: 0.010022
800470/80000000: 0.010006
799409/80000000: 0.009993
799832/80000000: 0.009998
800255/80000000: 0.010003
801864/80000000: 0.010023
801392/80000000: 0.010017
800937/80000000: 0.010012
798972/80000000: 0.009987
801878/80000000: 0.010023
801560/80000000: 0.010020
800877/80000000: 0.010011
799887/80000000: 0.009999
799456/80000000: 0.009993
800828/80000000: 0.010010
801512/80000000: 0.010019
800956/80000000: 0.010012
801174/80000000: 0.010015
800168/80000000: 0.010002
800360/80000000: 0.010005
801599/80000000: 0.010020
801635/80000000: 0.010020
801614/80000000: 0.010020
800033/80000000: 0.010000
802094/80000000: 0.010026
799929/80000000: 0.009999
800999/80000000: 0.010012
801185/80000000: 0.010015
800654/80000000: 0.010008
799215/80000000: 0.009990
799980/80000000: 0.010000
800497/80000000: 0.010006
801963/80000000: 0.010025
801104/80000000: 0.010014
800531/80000000: 0.010007
799453/80000000: 0.009993
801923/80000000: 0.010024
801422/80000000: 0.010018
800889/80000000: 0.010011
799768/80000000: 0.009997
799213/80000000: 0.009990
801098/80000000: 0.010014
801593/80000000: 0.010020
801055/80000000: 0.010013
800929/80000000: 0.010012
800402/80000000: 0.010005
800365/80000000: 0.010005
801474/80000000: 0.010018
802219/80000000: 0.010028
801225/80000000: 0.010015
800505/80000000: 0.010006
801376/80000000: 0.010017
799380/80000000: 0.009992
801442/80000000: 0.010018
801575/80000000: 0.010020
799732/80000000: 0.009997
799997/80000000: 0.010000
799999/80000000: 0.010000
800895/80000000: 0.010011
802111/80000000: 0.010026
800574/80000000: 0.010007
800409/80000000: 0.010005
799388/80000000: 0.009992
801527/80000000: 0.010019
802017/80000000: 0.010025
800628/80000000: 0.010008
799234/80000000: 0.009990
799860/80000000: 0.009998
800969/80000000: 0.010012
801623/80000000: 0.010020
801381/80000000: 0.010017
800189/80000000: 0.010002
801256/80000000: 0.010016
800489/80000000: 0.010006
801720/80000000: 0.010021
801742/80000000: 0.010022
800952/80000000: 0.010012
801089/80000000: 0.010014
801340/80000000: 0.010017
798761/80000000: 0.009985
801697/80000000: 0.010021
800677/80000000: 0.010008
800501/80000000: 0.010006
800415/80000000: 0.010005
799513/80000000: 0.009994
800661/80000000: 0.010008
802229/80000000: 0.010028
801670/80000000: 0.010021
799177/80000000: 0.009990
799967/80000000: 0.010000
801666/80000000: 0.010021
801346/80000000: 0.010017
800564/80000000: 0.010007
799146/80000000: 0.009989
800265/80000000: 0.010003
801607/80000000: 0.010020
801497/80000000: 0.010019
801467/80000000: 0.010018
799610/80000000: 0.009995
801389/80000000: 0.010017
799820/80000000: 0.009998
802501/80000000: 0.010031
801419/80000000: 0.010018
800811/80000000: 0.010010
801711/80000000: 0.010021
800624/80000000: 0.010008
798969/80000000: 0.009987
802280/80000000: 0.010028
800559/80000000: 0.010007
800158/80000000: 0.010002
800236/80000000: 0.010003
799908/80000000: 0.009999
800514/80000000: 0.010006
802423/80000000: 0.010030
801375/80000000: 0.010017
799075/80000000: 0.009988
800169/80000000: 0.010002
801978/80000000: 0.010025
801306/80000000: 0.010016
800882/80000000: 0.010011
798509/80000000: 0.009981
800622/80000000: 0.010008
801680/80000000: 0.010021
800697/80000000: 0.010009
801544/80000000: 0.010019
799626/80000000: 0.009995
801103/80000000: 0.010014
800522/80000000: 0.010007
802366/80000000: 0.010030
801008/80000000: 0.010013
801186/80000000: 0.010015
801687/80000000: 0.010021
800613/80000000: 0.010008
799604/80000000: 0.009995
801408/80000000: 0.010018
800547/80000000: 0.010007
800521/80000000: 0.010007
800155/80000000: 0.010002
800076/80000000: 0.010001
801057/80000000: 0.010013
801776/80000000: 0.010022
800650/80000000: 0.010008
799479/80000000: 0.009993
800873/80000000: 0.010011
801315/80000000: 0.010016
801513/80000000: 0.010019
800447/80000000: 0.010006
798764/80000000: 0.009985
800551/80000000: 0.010007
802180/80000000: 0.010027
800317/80000000: 0.010004
801378/80000000: 0.010017
799863/80000000: 0.009998
800711/80000000: 0.010009
801592/80000000: 0.010020
801796/80000000: 0.010022
801279/80000000: 0.010016
801120/80000000: 0.010014
801252/80000000: 0.010016
800839/80000000: 0.010010
799537/80000000: 0.009994
802332/80000000: 0.010029
799884/80000000: 0.009999
799773/80000000: 0.009997
799832/80000000: 0.009998
800767/80000000: 0.010010
801338/80000000: 0.010017
801518/80000000: 0.010019
801105/80000000: 0.010014
798797/80000000: 0.009985
801935/80000000: 0.010024
801360/80000000: 0.010017
801382/80000000: 0.010017
799920/80000000: 0.009999
799015/80000000: 0.009988
800685/80000000: 0.010009
801781/80000000: 0.010022
800804/80000000: 0.010010
801022/80000000: 0.010013
800313/80000000: 0.010004
800505/80000000: 0.010006
801702/80000000: 0.010021
801546/80000000: 0.010019
801665/80000000: 0.010021
800271/80000000: 0.010003
801781/80000000: 0.010022
800005/80000000: 0.010000
800381/80000000: 0.010005
802116/80000000: 0.010026
800541/80000000: 0.010007
799047/80000000: 0.009988
799790/80000000: 0.009997
800722/80000000: 0.010009
801454/80000000: 0.010018
801441/80000000: 0.010018
801025/80000000: 0.010013
798701/80000000: 0.009984
802108/80000000: 0.010026
801466/80000000: 0.010018
800775/80000000: 0.010010
799784/80000000: 0.009997
799250/80000000: 0.009991
801135/80000000: 0.010014
801574/80000000: 0.010020
800853/80000000: 0.010011
801397/80000000: 0.010017
800192/80000000: 0.010002
800708/80000000: 0.010009
801128/80000000: 0.010014
802149/80000000: 0.010027
801001/80000000: 0.010013
800355/80000000: 0.010004
801810/80000000: 0.010023
799598/80000000: 0.009995
801250/80000000: 0.010016
801729/80000000: 0.010022
799878/80000000: 0.009998
799688/80000000: 0.009996
800215/80000000: 0.010003
800344/80000000: 0.010004
802555/80000000: 0.010032
800765/80000000: 0.010010
800086/80000000: 0.010001
799461/80000000: 0.009993
801398/80000000: 0.010017
802046/80000000: 0.010026
800606/80000000: 0.010008
799708/80000000: 0.009996
799463/80000000: 0.009993
801095/80000000: 0.010014
801379/80000000: 0.010017
801440/80000000: 0.010018
800369/80000000: 0.010005
801099/80000000: 0.010014
800528/80000000: 0.010007
801653/80000000: 0.010021
801678/80000000: 0.010021
801284/80000000: 0.010016
800524/80000000: 0.010007
801259/80000000: 0.010016
799173/80000000: 0.009990
801551/80000000: 0.010019
801049/80000000: 0.010013
800586/80000000: 0.010007
800287/80000000: 0.010004
799769/80000000: 0.009997
800471/80000000: 0.010006
802116/80000000: 0.010026
801325/80000000: 0.010017
799604/80000000: 0.009995
799612/80000000: 0.009995
802182/80000000: 0.010027
800965/80000000: 0.010012
800678/80000000: 0.010008
799231/80000000: 0.009990
800200/80000000: 0.010002
801194/80000000: 0.010015
801590/80000000: 0.010020
801391/80000000: 0.010017
799948/80000000: 0.009999
801334/80000000: 0.010017
800097/80000000: 0.010001
802098/80000000: 0.010026
801702/80000000: 0.010021
800796/80000000: 0.010010
801349/80000000: 0.010017
801020/80000000: 0.010013
798904/80000000: 0.009986
802166/80000000: 0.010027
800401/80000000: 0.010005
800224/80000000: 0.010003
800836/80000000: 0.010010
799507/80000000: 0.009994
800467/80000000: 0.010006
802414/80000000: 0.010030
801431/80000000: 0.010018
798823/80000000: 0.009985
800454/80000000: 0.010006
801748/80000000: 0.010022
801390/80000000: 0.010017
800822/80000000: 0.010010
798526/80000000: 0.009982
800586/80000000: 0.010007
801563/80000000: 0.010020
800989/80000000: 0.010012
801723/80000000: 0.010022
799803/80000000: 0.009998
800863/80000000: 0.010011
800333/80000000: 0.010004
802673/80000000: 0.010033
800649/80000000: 0.010008
801286/80000000: 0.010016
801865/80000000: 0.010023
800556/80000000: 0.010007
799030/80000000: 0.009988
801778/80000000: 0.010022
800481/80000000: 0.010006
800563/80000000: 0.010007
800313/80000000: 0.010004
799991/80000000: 0.010000
800968/80000000: 0.010012
802057/80000000: 0.010026
800803/80000000: 0.010010
799105/80000000: 0.009989
800761/80000000: 0.010010
801690/80000000: 0.010021
801102/80000000: 0.010014
800985/80000000: 0.010012
798420/80000000: 0.009980
800651/80000000: 0.010008
802180/80000000: 0.010027
800295/80000000: 0.010004
801465/80000000: 0.010018
799548/80000000: 0.009994
800912/80000000: 0.010011
801453/80000000: 0.010018
801809/80000000: 0.010023
801203/80000000: 0.010015
801330/80000000: 0.010017
801250/80000000: 0.010016
800883/80000000: 0.010011
799242/80000000: 0.009991
802246/80000000: 0.010028
799817/80000000: 0.009998
800367/80000000: 0.010005
800084/80000000: 0.010001
800262/80000000: 0.010003
801462/80000000: 0.010018
801152/80000000: 0.010014
801251/80000000: 0.010016
799181/80000000: 0.009990
801387/80000000: 0.010017
801105/80000000: 0.010014
801494/80000000: 0.010019
800340/80000000: 0.010004
798966/80000000: 0.009987
800717/80000000: 0.010009
801788/80000000: 0.010022
800693/80000000: 0.010009
801039/80000000: 0.010013
800107/80000000: 0.010001
800617/80000000: 0.010008
801399/80000000: 0.010017
801958/80000000: 0.010024
801384/80000000: 0.010017
800412/80000000: 0.010005
801919/80000000: 0.010024
800354/80000000: 0.010004
799993/80000000: 0.010000
801957/80000000: 0.010024
800589/80000000: 0.010007
799291/80000000: 0.009991
799686/80000000: 0.009996
800381/80000000: 0.010005
801817/80000000: 0.010023
801573/80000000: 0.010020
800944/80000000: 0.010012
798942/80000000: 0.009987
801709/80000000: 0.010021
801554/80000000: 0.010019
800896/80000000: 0.010011
800020/80000000: 0.010000
799312/80000000: 0.009991
801023/80000000: 0.010013
801175/80000000: 0.010015
801235/80000000: 0.010015
801026/80000000: 0.010013
800629/80000000: 0.010008
800351/80000000: 0.010004
801346/80000000: 0.010017
801594/80000000: 0.010020
801543/80000000: 0.010019
799958/80000000: 0.009999
802109/80000000: 0.010026
800036/80000000: 0.010000
800613/80000000: 0.010008
801745/80000000: 0.010022
800181/80000000: 0.010002
799540/80000000: 0.009994
799818/80000000: 0.009998
800411/80000000: 0.010005
802614/80000000: 0.010033
800895/80000000: 0.010011
800343/80000000: 0.010004
799347/80000000: 0.009992
801599/80000000: 0.010020
801692/80000000: 0.010021
800953/80000000: 0.010012
799749/80000000: 0.009997
799022/80000000: 0.009988
801419/80000000: 0.010018
801489/80000000: 0.010019
801306/80000000: 0.010016
800447/80000000: 0.010006
800656/80000000: 0.010008
800372/80000000: 0.010005
801675/80000000: 0.010021
801952/80000000: 0.010024
801222/80000000: 0.010015
800789/80000000: 0.010010
801251/80000000: 0.010016
799087/80000000: 0.009989
801531/80000000: 0.010019
801453/80000000: 0.010018
800027/80000000: 0.010000
800143/80000000: 0.010002
799882/80000000: 0.009999
800651/80000000: 0.010008
802008/80000000: 0.010025
800978/80000000: 0.010012
800143/80000000: 0.010002
799389/80000000: 0.009992
801792/80000000: 0.010022
801672/80000000: 0.010021
800863/80000000: 0.010011
799350/80000000: 0.009992
799811/80000000: 0.009998
801061/80000000: 0.010013
801439/80000000: 0.010018
801506/80000000: 0.010019
800055/80000000: 0.010001
801321/80000000: 0.010017
800106/80000000: 0.010001
802064/80000000: 0.010026
801764/80000000: 0.010022
800662/80000000: 0.010008
801260/80000000: 0.010016
801389/80000000: 0.010017
798589/80000000: 0.009982
802118/80000000: 0.010026
800484/80000000: 0.010006
800419/80000000: 0.010005
800574/80000000: 0.010007
799727/80000000: 0.009997
800393/80000000: 0.010005
802369/80000000: 0.010030
801305/80000000: 0.010016
799237/80000000: 0.009990
800096/80000000: 0.010001
801742/80000000: 0.010022
801002/80000000: 0.010013
801072/80000000: 0.010013
798750/80000000: 0.009984
800485/80000000: 0.010006
801502/80000000: 0.010019
801336/80000000: 0.010017
801636/80000000: 0.010020
799640/80000000: 0.009995
801200/80000000: 0.010015
799983/80000000: 0.010000
802703/80000000: 0.010034
801153/80000000: 0.010014
800650/80000000: 0.010008
802108/80000000: 0.010026
800634/80000000: 0.010008
798799/80000000: 0.009985
801939/80000000: 0.010024
800500/80000000: 0.010006
800794/80000000: 0.010010
799961/80000000: 0.010000
799847/80000000: 0.009998
800929/80000000: 0.010012
802404/80000000: 0.010030
800871/80000000: 0.010011
799148/80000000: 0.009989
800248/80000000: 0.010003
802077/80000000: 0.010026
801130/80000000: 0.010014
800988/80000000: 0.010012
798719/80000000: 0.009984
800434/80000000: 0.010005
801573/80000000: 0.010020
800775/80000000: 0.010010
801478/80000000: 0.010018
799815/80000000: 0.009998
800746/80000000: 0.010009
801183/80000000: 0.010015
802013/80000000: 0.010025
801092/80000000: 0.010014
801106/80000000: 0.010014
801783/80000000: 0.010022
800560/80000000: 0.010007
799503/80000000: 0.009994
801621/80000000: 0.010020
800130/80000000: 0.010002
800325/80000000: 0.010004
800542/80000000: 0.010007
799935/80000000: 0.009999
801124/80000000: 0.010014
801721/80000000: 0.010022
800891/80000000: 0.010011
799461/80000000: 0.009993
800958/80000000: 0.010012
801274/80000000: 0.010016
801534/80000000: 0.010019
800224/80000000: 0.010003
799078/80000000: 0.009988
800554/80000000: 0.010007
801876/80000000: 0.010023
800448/80000000: 0.010006
801355/80000000: 0.010017
799774/80000000: 0.009997
801020/80000000: 0.010013
801257/80000000: 0.010016
802070/80000000: 0.010026
801247/80000000: 0.010016
800799/80000000: 0.010010
801301/80000000: 0.010016
800863/80000000: 0.010011
799853/80000000: 0.009998
801955/80000000: 0.010024
800270/80000000: 0.010003
799648/80000000: 0.009996
799635/80000000: 0.009995
800617/80000000: 0.010008
801728/80000000: 0.010022
801345/80000000: 0.010017
801111/80000000: 0.010014
798709/80000000: 0.009984
802121/80000000: 0.010027
801177/80000000: 0.010015
801198/80000000: 0.010015
799885/80000000: 0.009999
799417/80000000: 0.009993
800798/80000000: 0.010010
801662/80000000: 0.010021
800809/80000000: 0.010010
801094/80000000: 0.010014
800333/80000000: 0.010004
800186/80000000: 0.010002
801745/80000000: 0.010022
801630/80000000: 0.010020
801546/80000000: 0.010019
800203/80000000: 0.010003
801982/80000000: 0.010025
799751/80000000: 0.009997
800857/80000000: 0.010011
801680/80000000: 0.010021
800389/80000000: 0.010005
799540/80000000: 0.009994
799855/80000000: 0.009998
800417/80000000: 0.010005
801856/80000000: 0.010023
801223/80000000: 0.010015
800587/80000000: 0.010007
799179/80000000: 0.009990
801964/80000000: 0.010025
801735/80000000: 0.010022
800498/80000000: 0.010006
800080/80000000: 0.010001
799009/80000000: 0.009988
801161/80000000: 0.010015
801662/80000000: 0.010021
801002/80000000: 0.010013
800940/80000000: 0.010012
800227/80000000: 0.010003
800631/80000000: 0.010008
801274/80000000: 0.010016
802149/80000000: 0.010027
801317/80000000: 0.010016
800254/80000000: 0.010003
801469/80000000: 0.010018
799928/80000000: 0.009999
801137/80000000: 0.010014
801662/80000000: 0.010021



Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

CalgaryCorpus

#13
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:


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);
     }
   }
 }
}

Aqui mi perfil en LinkedIn, invitame un cafe aqui

AlbertoBSD

#14
Si tienes razón, tu código funciona.  ;-)

La aproximación por probabilidad que implemente a un byte es la mas sencilla de entender, claro ineficiente por que prueba bit por bit si debe de ser o no modificado, la desviación estandar es muy baja y la media siempre esta sobre el % indicado por "Cuantos"

En fin, estoy de acuerdo que la versión por probabilidad NO hace exactamente lo que pide el programa, sin embargo es muy acercado a lo que se pide.

He realizado un nuevo código que funciona de byte en byte y NO UTILIZA PROBABILIDAD,

Funciona Byte a Byte por que en algún punto el modulo de ruido se debe de acoblar a un modulo "Canal" cosa que no voy a discutir aqui.

Esta en forma de Clase por que necesitamos tener control de variables internas y llevar registro de cuales bits ya modificamos.

Dejo el codigo por si a alguien le sirve, el algoritmo de ordenamiento se puede mejorar, para dejarlo simple utilice el ordenamiento burbuja. Cámbienlo por el que les guste.

El programa  utiliza objeto de clase Noise y genera una lista previa de los bits que va a modificar, y solo modifica dichos bits cuando le mandan un byte que contenga el indice de bit mencionado.

Este programa no sabe a priori cuantos bytes le van a enviar, por lo que el ciclo de "cuantos" por cada 100 solo se cumple cuando el numero de bits que se le a enviado es múltiplo de 100.

Código (cpp) [Seleccionar]

#include<string.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define LEN 25

class Noise
{
private:
unsigned char cuantos;
unsigned char valor;
int index_nibble;
int lista_actual;
int *lista;
int next;
void generar_lista();
void ordenar_lista();
public:
unsigned int recibidos;
unsigned int modificados;
Noise(unsigned char _cuantos, unsigned char _valor);
~Noise();
char modificar(char b);
};

Noise::Noise(unsigned char _cuantos, unsigned char _valor) {
cuantos = _cuantos;
valor = _valor;
index_nibble = 0;
recibidos = 0;
modificados = 0;
lista = new int[cuantos];
srand(time(NULL));
generar_lista();
}

Noise::~Noise() {
delete lista;
}

void Noise::generar_lista() {
lista_actual = 0;
int no_duplicados[100] = {0};
int i = 0,r;
while(i < cuantos) {
do {
r = rand() % 100;
}while(no_duplicados[r] == 1);
no_duplicados[r] = 1;
//printf("Numero random %i\n",r);
lista[i] = r;
i++;
}
ordenar_lista();
next = lista[lista_actual];
}

void Noise::ordenar_lista() {
int i,j,aux;
i = 1;
while(i<cuantos) {
j = 0;
while(j<(cuantos-1)) {
if(lista[j] > lista[j+1]) {
aux = lista[j];
lista[j] = lista[j+1];
lista[j+1] = aux;
}
j++;
}
i++;
}
/*
Solo para imprimir las siguientes lineas se pueden omitir
*/
/*
printf("Lista Ordenada: ");
i = 0;
while(i< cuantos) {
printf("%i\t",lista[i++]);
}
printf("\n");
*/

}

char Noise::modificar(char b) { //Se divide el byte recibido en nibbles para trabajar correctamente con divisores de 100, ya que 8 no es divisible entre 100
int i;
int entrar = 1;
int bit_offset;
char nibble[2];
recibidos+=8;

/*
Lo siguiente es hardware dependiente pero me da flojera realizar la prueba... Supongo que la mayoria utilizara little endian
*/
nibble[0] = b & 0x0F;
nibble[1] = b & 0xF0;
nibble[1] = nibble[1] >> 4;
//printf("Numero separado en nibbles '%c' : [%i,%i]\n",b,nibble[0],nibble[1]);
i = 0;
while(i < 2) {
entrar = 1;
//printf("Evaluando index nibble %i, buscando %i, index actual de la lista %i:%i\n",index_nibble,next/4,lista_actual,lista[lista_actual]);
while(entrar && index_nibble == next/4) {
bit_offset = next % 4;
//printf("Encontrado., bit a modificar %i\n",bit_offset);
if(valor) {
nibble[i] |= 1 << bit_offset;
}
else {
nibble[i] &= ~(1 << bit_offset);
}
lista_actual++;
if(lista_actual < cuantos) {
next = lista[lista_actual];
}
else {
entrar = 0;
}
modificados++;
}
index_nibble++;
if(index_nibble == 25) {
index_nibble = 0;
generar_lista();
}
i++;
}
return nibble[0] + (nibble[1] << 4);;
}

int main() {
char mensaje[LEN+1];
unsigned int i = 0;
Noise noise(1,1); //10 bytes modificados por cada 100
memset(mensaje,'A',LEN);
printf("Mensaje antes del Ruido: %s\n",mensaje);
while(i < LEN) {
mensaje[i] = noise.modificar(mensaje[i]);
i++;
}
printf("Mensaje despues del Ruido: %s\n",mensaje);
printf("%u/%u\n",noise.modificados,noise.recibidos);
}


Aun asi, yo sigo prefiriendo la funcion por PROBABILIDAD, ya que es la mas sencilla y rapida de implementar. Y funciona bien digan lo que digan en el largo plazo se comporta aproximadamente se esperaba y funcionaria aun mejor si la distribucion de los nimeros pseudo-aleatorios fuera mas uniforme.



char noise(char byte,unsigned char cuantos, unsigned char valor) {
int i = 0;
recibidos+= 8;
while(i < 8) {
if((rand() % 100) < cuantos) {
modificados++;
if(valor) {
byte |= 1 << i;
}
else {
byte &= ~(1 << i);
}
}
i++;
}
return byte;
}
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW