Generateur de bits aléatoires

Soyez le premier à donner votre avis sur cette source.

Vue 8 277 fois - Téléchargée 217 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

Messages postés
2
Date d'inscription
mercredi 17 septembre 2008
Statut
Membre
Dernière intervention
26 septembre 2010

int aleatoire()
{
static int pos=BUFSIZE-1;
int dif;

pos++;

if(pos==BUFSIZE)
{
waveInAddBuffer(wavein,&headerIn,sizeof(headerIn));
pos=1;
}

dif= buffer[pos-1]*2 - buffer[pos] - buffer[pos-2];
return dif>0;
}

j'ai l'impression que sa marche mieux
Messages postés
2
Date d'inscription
mercredi 17 septembre 2008
Statut
Membre
Dernière intervention
26 septembre 2010

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...
}
Messages postés
1
Date d'inscription
mardi 23 février 2010
Statut
Membre
Dernière intervention
23 février 2010

salut
je cherche un generateur de son aleatoire de bruit electronique
suis je bien tombe?
ce site a l air tres specialiser
j ai besoin de ce logiciel pour un travail musical dans l esprit de david dunne ou xenakis pour ceux qui connaissent
dans cette ordre d idee existe il des logiciels capable d extraire une suite de bits de n importe quel support et de l interpreter en image ou son
ex:la suite de bits encodant une photo traduit en son et inversement
merci
Messages postés
11
Date d'inscription
lundi 2 février 2004
Statut
Membre
Dernière intervention
11 juillet 2009

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.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

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.
Afficher les 10 commentaires

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.