Generateur de bits aléatoires

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

Codes Sources

A voir également

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.