Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GENERATEUR DE BITS ALÉATOIRES


Information sur la source

Catégorie :Divers Classé sous : aléatoire, bruit, son Niveau : Débutant Date de création : 15/06/2007 Date de mise à jour : 15/06/2007 14:04:54 Vu / téléchargé: 4 366 / 139

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

Ce code permet de génerer des bits aléatoires en utilisant le bruit de Johnson sur les entrées de la carte son. Pour utiliser ce programme sélectionnez plutôt l'entrée micro (il y a plus de bruit) et ne branchez rien dessus.
 

Source

  • //generation de bits aléatoires avec une carte son
  • //par philippe pasty 2007
  • #include <windows.h>
  • #include <stdio.h>
  • #include <mmsystem.h>
  • #include <math.h>
  • #include <stdlib.h>
  • #define BUFSIZE 2000
  • short int *buffer;
  • HWAVEIN wavein;
  • WAVEHDR headerIn;
  • int fini;
  • void CALLBACK AudioProcIn(
  • HWAVE hWave, // handle of waveform device
  • UINT uMsg, // sent message
  • DWORD dwInstance, // instance data
  • DWORD dwParam1, // application-defined parameter
  • DWORD dwParam2 // application-defined parameter
  • )
  • {
  • if(uMsg==WIM_DATA)
  • {
  • fini=1;
  • }
  • }
  • //prépare l'enregistrement PCM
  • int init()
  • {
  • MMRESULT err;
  • WAVEFORMATEX pwfx;
  • int resolution=2; //16 bits
  • int fechant=44100;//frequence d'echantillonage
  • pwfx.wFormatTag =WAVE_FORMAT_PCM;
  • pwfx.nChannels =1;
  • pwfx.nSamplesPerSec = fechant;
  • pwfx.nAvgBytesPerSec = fechant*resolution;
  • pwfx.nBlockAlign =resolution;
  • pwfx.wBitsPerSample = resolution<<3;
  • pwfx.cbSize = 0;
  • err = waveInOpen(&wavein,0,&pwfx,(DWORD)AudioProcIn,0,CALLBACK_FUNCTION);
  • if (err==MMSYSERR_NOERROR)
  • {
  • headerIn.lpData =(LPSTR) buffer;
  • headerIn.dwBytesRecorded = 0;
  • headerIn.dwUser = 0;
  • headerIn.dwFlags = 0;
  • headerIn.dwLoops =1;
  • headerIn.dwBufferLength = BUFSIZE*resolution;
  • waveInPrepareHeader(wavein,&headerIn,sizeof(headerIn));
  • waveInStart(wavein);
  • return 1;
  • }
  • return 0;
  • }
  • //renvoie 0 ou 1 avec une probabilité 1/2
  • int aleatoire()
  • {
  • static int pos=BUFSIZE-1;
  • int dif;
  • do{
  • pos++;
  • if(pos==BUFSIZE)
  • {
  • fini=0;
  • waveInAddBuffer(wavein,&headerIn,sizeof(headerIn));
  • while(!fini);
  • pos=1;
  • }
  • dif= buffer[pos] - buffer[pos-1];
  • if(dif<0) return 1;
  • if(dif>0) return 0;
  • }while(1);
  • }
  • int main()
  • {
  • int n,s=0,bit;
  • buffer =(short int*) malloc(BUFSIZE*2);
  • if(!init()){printf("erreur sur la carte son\n"); return 0;}
  • for (n=0;n<10000;n++)
  • {if (!(n%50)) printf("\n%4d ",n);
  • bit=aleatoire();s+=bit;
  • printf("%d",bit);
  • }
  • printf("\nnombre de 1: %d\n",s);
  • waveInUnprepareHeader(wavein,&headerIn,sizeof(headerIn));
  • waveInClose(wavein);
  • return 1;
  • }
//generation de bits aléatoires avec une carte son
//par philippe pasty 2007

#include <windows.h>
#include <stdio.h>
#include <mmsystem.h>
#include <math.h>
#include <stdlib.h>

#define BUFSIZE 2000
short int *buffer;
HWAVEIN wavein;
WAVEHDR headerIn;

int fini;

void CALLBACK AudioProcIn(
    HWAVE  hWave,	// handle of waveform device
    UINT  uMsg,	// sent message
    DWORD  dwInstance,	// instance data
    DWORD  dwParam1,	// application-defined parameter
    DWORD  dwParam2	// application-defined parameter
   )
{
 if(uMsg==WIM_DATA)
 {
  fini=1;
 }
}

//prépare l'enregistrement PCM
int init()
{
 MMRESULT err;
 WAVEFORMATEX pwfx;
 int resolution=2; //16 bits
 int fechant=44100;//frequence d'echantillonage

 pwfx.wFormatTag =WAVE_FORMAT_PCM;
 pwfx.nChannels =1;
 pwfx.nSamplesPerSec = fechant;
 pwfx.nAvgBytesPerSec = fechant*resolution;
 pwfx.nBlockAlign =resolution;
 pwfx.wBitsPerSample = resolution<<3;
 pwfx.cbSize = 0;

 err = waveInOpen(&wavein,0,&pwfx,(DWORD)AudioProcIn,0,CALLBACK_FUNCTION);
 if (err==MMSYSERR_NOERROR)
  {
   headerIn.lpData =(LPSTR) buffer;
   headerIn.dwBytesRecorded = 0;
   headerIn.dwUser = 0;
   headerIn.dwFlags = 0;
   headerIn.dwLoops =1;
   headerIn.dwBufferLength = BUFSIZE*resolution;
   waveInPrepareHeader(wavein,&headerIn,sizeof(headerIn));

   waveInStart(wavein);
   return 1;
  }
  return 0;
}

//renvoie 0 ou 1 avec une probabilité 1/2
int aleatoire()
{
 static int pos=BUFSIZE-1;
 int dif;

 do{
  pos++;
  if(pos==BUFSIZE)
  {
   fini=0;
   waveInAddBuffer(wavein,&headerIn,sizeof(headerIn));
   while(!fini);
   pos=1;
  }
  dif= buffer[pos] - buffer[pos-1];
  if(dif<0) return 1;
  if(dif>0) return 0;
 }while(1);
}

int main()
{
  int n,s=0,bit;
  buffer =(short int*) malloc(BUFSIZE*2);

  if(!init()){printf("erreur sur la carte son\n"); return 0;}

  for (n=0;n<10000;n++)
  {if (!(n%50)) printf("\n%4d ",n);
   bit=aleatoire();s+=bit;
   printf("%d",bit);
  }
  printf("\nnombre de 1: %d\n",s);
  waveInUnprepareHeader(wavein,&headerIn,sizeof(headerIn));
  waveInClose(wavein);

  return 1;
}

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

15 juin 2007 14:04:54 :
modification cas buffer[pos]=buffer[pos-1]

Commentaires et avis

signaler à un administrateur
Commentaire de max12 le 15/06/2007 13:54:05 administrateur CS

C'est pas fou du tout loin de la, mais a quoi sa peut servir par rapport au rand()? C'est un peu lourd comme méthode. A moins que ce soit moi qui n'est pas bien saisi quelque chose.

Enfin, le code pour extraire les données de la carte de son n'en ait pas moins intéressant car simple comme tout à comprendre et efficace.

Pendant qu'on parle de microphone mon idée était de m'en servir pour mesurer la vitesse d'une balle de paintball grâce a son taux d'échantillionnage élevé :D (Je dis sa, car si quelqu'un est au courant que sa deja été fait j'aimerais qu'il me le dise :P)

A+

signaler à un administrateur
Commentaire de pasty le 15/06/2007 14:11:27

La fonction rand() est complètement différente, elle génère des nombres pseudo aléatoire: c'est à dire que l'on initialise avec srand, puis chaque appel de rand calcule un nouveau nombre de manière déterministe. Au contraire mon code utilise le bruit éléctronique pour générer des bits.

signaler à un administrateur
Commentaire de max12 le 15/06/2007 14:33:22 administrateur CS

Je me disais surtout que même s'il est pseudo aléatoire le rand() sort quand même des bons résultats en le combinant a time() et je me questionnais sur l'idée de faire tout ça pour obtenir le chiffre. Mais je ne discrédite pas cette idée qui est vraiment excellente. Il faudrait maintenant en faire une version Java, qui avec sa fonction avait la facheuse tendance a sortir 5 fois de suite le même chiffre sur une possibilité de 10 lol (Mon jeu de tetris en applet JAVA en prenait un coup).

Sur ce, bonne prog A+

signaler à un administrateur
Commentaire de Neo_Fr le 15/06/2007 15:01:52

La vitesse d'une bille de paintball c'est environ 300km/h...

signaler à un administrateur
Commentaire de max12 le 15/06/2007 15:19:29 administrateur CS

ouais environ, mais quand tu veux ajuster ton fusil pour qu'il soit sécuritaire il te faut un chronograph. Un chronograph c'est 160$ si je peux mesurer la vitesse en tirant une balle sur un objet situé à 5 pieds environ en mesurant la distance entre les 2 pics de sons (tir et obstacle) il est possible de déduire la vitesse. Donc au lieu de payer un bras et une jambe pour un chronograph tu prends un micro et c'est réglé. Sa sert également a mesurer la précision de la vitesse selon les réglages. Sachant qu'il faut se tenir aux environs de 300 pieds/sec (324 km/h environ).

signaler à un administrateur
Commentaire de SnOOpss le 23/12/2008 16:22:57

J'ai testé ton code, et il est loin d'etre aleatoire, il y a une dominance de bit a 1 sur ceux a 0 a chacun de mes tests.

signaler à un administrateur
Commentaire de pasty le 27/12/2008 10:47:24

Le bruit enregistré sur la carte son n'est pas un bruit de Johnson parfait, ce qui peut expliquer le déséquilibre de 1 et de 0. Sur ma carte sound blaster et avec l'entrée micro, sur 20 tirages de 10000 bits, il y a 7 tirages avec une dominance de 0 et 13 avec une dominance de 1.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

nombre aléatoire [ par obasileus ] salut,je ne trouve pas la commande qui permet de faire générer à l'ordinateur un nombre aléatoireplease help me !!!! :-)merci toujours nombre aléatoire [ par obasileus ] Salut à tous, j'ai demander il y a quelque jours comment générer un nb aléatoire. Je remerci d'ailleur Jo de m'avoir répondu. Cependant je bosse sous comment générer un chiffre de façon aléatoire [ par magicoz ] Bonjour, J'aurais souhaité savoir comment générer en C un chiffre de façon aléatoire compris entre 1 et 6 par exemple. Si possible, me fournir un exe Aléatoire [ par lainlain ] Salut tout le monde!Alors, voilà mon problème:Je cherche à faire un programme qui génère des nombres aléatoires dans une certaine plage donnée, mais j Nombre aléatoire de type Double [ par BRAUKRIS ] Impossible de génère un nombre aléatoire à virgule.J?ai utilisé la fonction rand mais elle me renvoie toujours un nombre entier.Comment doit-je faire tirage aléatoire selon une loi gaussienne [ par marmotte33 ] Je cherche à faire un petit programme en c++ permettant d'obtenir une variable aléatoire suivant une loi Gaussienne, en paramétrant la valeur moyenne reduction du bruit [ par tdeco ] Salutje cherche à réduire le bruit sur une image squi est sous forme de matrice (fichier txt).cette matrice (suite de 1 et 0) de dimension 16*16 repre Générer un nombre aléatoire [ par lan32 ] Est ce que vous savez quelle est la fonction qui permet de générer un nombre aléatoire par exemple compris entre 0 et 100.Et aussi comment faire pour Syntaxe pour un nombre aléatoire. [ par marcel6566 ] Bonjour,VC++6 MFCJe souhaiterais générer un nombre aléatoire.int m_a=0;Comment rendre m_a aléatoire entre 0 et 17 ?Avant j'utilisais random mais avec [DEBUTANT] Fonction rand () [ par kojiro2 ] G un problème avec la fonction rand dans un pti jeuke je suis en train de faire.Je veux générer un nombre aléatoire (jusque là pas de pb).Ce nombre al


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,889 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.