Generateur de bits aléatoires

4/5 (10 avis)

Vue 8 555 fois - Téléchargée 227 fois

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

Ajouter un commentaire Commentaires
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
15 juin 2007 à 13:54
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+
cs_pasty Messages postés 11 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 11 juillet 2009
15 juin 2007 à 14:11
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.
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
15 juin 2007 à 14:33
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+
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
15 juin 2007 à 15:01
La vitesse d'une bille de paintball c'est environ 300km/h...
ciddiju Messages postés 2 Date d'inscription mercredi 17 septembre 2008 Statut Membre Dernière intervention 26 septembre 2010
26 sept. 2010 à 14:46
Salut

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.