générer une suite de bits aléatoire - C++ - Programmation
Marsh Posté le 08-05-2012 à 11:58:50
Dans le code que tu as donné, il y avait deux emplois de 1000 à la place de 100, ce qui donnait des valeurs en dehors des bornes du tableau.
E corrigeant cela et reformatant le code, on obtient ceci qui compile:
Code :
|
C:\clang>bruit.exe |
A+,
Marsh Posté le 07-06-2012 à 22:28:24
Pourquoi ne pas simplement lire les bits de la variable renvoyé par rand() ? il y en a log2(RAND_MAX) par appel de la fonction.
Pour les lire, faire un masque avec un ET logique, puis un bitshift.
Un truc du genre (j'ai pas essayé) :
int e = rand();
for (j=0; j < log2(RAND_MAX); j++) cout << (e & (1 >> j)) << j;
remplacer ensuite j par ta "position bruitée"
Marsh Posté le 08-06-2012 à 11:43:09
theshockwave a écrit : accessoirement, le modulo sur le random est à proscrire. sujet débattu à maintes reprises ici même. |
On utilise quoi dans ce cas pour garder l'uniformité ?
Marsh Posté le 08-06-2012 à 16:06:57
theshockwave a écrit : accessoirement, le modulo sur le random est à proscrire. sujet débattu à maintes reprises ici même. |
Terminapor a écrit : |
+1, je veux pas être méchant mais claquer une phrase juste comme ça sans explication ça a aucun intérêt
Marsh Posté le 08-06-2012 à 16:12:53
Apparemment, le mieux c'est de mettre sur un interval 0-1 et ensuite de régler le résultat :
Code :
|
(La je crois que c'est pour un nombre entre 1 et 14621)
source : http://stackoverflow.com/questions [...] enerator-c
Marsh Posté le 08-06-2012 à 16:20:00
Terminapor a écrit : Apparemment, le mieux c'est de mettre sur un interval 0-1 et ensuite de régler le résultat :
|
Bon à savoir
Marsh Posté le 08-06-2012 à 16:29:03
Terminapor a écrit : Apparemment, le mieux c'est de mettre sur un interval 0-1 et ensuite de régler le résultat :
source : http://stackoverflow.com/questions [...] enerator-c |
Une autre methode et une explication plus complete des problemes (y compris ceux de la methode ci-dessus): http://www.bourguet.org/v2/clang/random/
Marsh Posté le 08-06-2012 à 20:49:56
En prenant celle de ce papier et l'adaptant vite fait:
Code :
|
Un exemple de sortie:
101010100100010111001000110100001011000110100101001111101101100110011101010 |
A+,
Marsh Posté le 11-06-2012 à 14:34:08
WiiDS a écrit : +1, je veux pas être méchant mais claquer une phrase juste comme ça sans explication ça a aucun intérêt |
Roh les boulets qui prennent pas le temps de chercher 30 secondes ...
La fonction rand a une meilleure qualite d'aleatoire sur les bits de poids fort. Prendre les bits de poids faible, c'est mal utiliser la fonction. Si tu veux des 0 ou des 1 tu fais des shift et pas juste et masque ou un modulo qui va te pourrir ta repartition.
Maintenant tu es content, ton repas tombe tout cuit dans ton assiette ?
Edit : du coup c'est ce qui explique l'utilite de passer sur l'intervalle 0-1 comme dit plus haut oui. Apres on n'a pas toujours envie de passer par des floats. Il faut juste retenir qu'il faut utiliser les bits de poids fort
Marsh Posté le 11-06-2012 à 21:12:05
theshockwave a écrit : |
Hého, hein
Si je demande des détails, c'est parce que la plupart des sites internet (même sérieux) proposent l'implémentation classique avec modulo. Même cplusplus.com propose d'utiliser rand de cette manière ( http://www.cplusplus.com/reference [...] dlib/rand/ ) bien qu'il y ait effectivement un petit avertissement sur la répartition des nombres générés.
Bref merci quand même pour ta bonne humeur et ton savoir
Marsh Posté le 08-05-2012 à 01:01:34
bonjour ;
svp quelqu'un peut me dire pourquoi ce programme n'affiche pas des résultats correctes.
Je veux générer un tableau qui contient des suite aléatoires des 0 et 1, et autre tableau génère les positions aléatoires. A partir des positions du 2em tableau je veux accéder au 1er tableau et modifier les positions c'est à dire si le 1er tableau contient un zéro je le rend 1 et vise versa.
void Bruit(){
int tab4[100];
int tab3[100];
char tab2[100];
int m;
int h;
char w='x';
char v='+';
cout <<"\n \n les suites aléatoires générées : \n \n";
for(int m=0;m<1000;m++)
{
tab3[m]=rand()%2;
cout<<tab3[m];
}
cout <<"\n \n les positions bruitees: \n \n";
for(int m=0;m<100;m++){
tab4[m]=rand()%1000;
cout<<tab4[m]<<" ";}
cout <<"\n \n les suite des bits bruitees sont: \n \n";
for(int m=0;m<100;m++){
if(tab3[tab4[m]]==1)
{tab3[tab4[m]]=0;}
else
{tab3[tab4[m]]=1;}
cout<<tab3[m]<<" ";}
}