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 / Exemple :
//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;
}
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.