4/5 (10 avis)
Vue 8 555 fois - Téléchargée 227 fois
//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; }
15 juin 2007 à 13:54
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+
15 juin 2007 à 14:11
15 juin 2007 à 14:33
Sur ce, bonne prog A+
15 juin 2007 à 15:01
26 sept. 2010 à 14:46
Code super intéressant merci.
Par contre a quoi sert le while (!fini);
avec fini=0;
c'est pour faire chier les noob :) ?
PS différence entre aléatoire et pseudo-aléatoire
il m'était arrivé en utilisant rand () pour des simulations du jeux de la roullette, (en utilisant la soi disant maniere infaillible de gagner lol ), d'obtenir les meme resultats quelque soit la graine...
ensuite en utilisant une autre maniere de generer les nombres les résultats varié...
un truc du genre :
float rand2 ()
{
static float graine=npk;
return (graine = 1/graine - graine/2)>0; // c'est pourri je sais...
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.