begin process at 2012 02 10 09:00:43
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > GENERATEUR DE BITS ALÉATOIRES

GENERATEUR DE BITS ALÉATOIRES


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :aléatoire, bruit, son Niveau :Débutant Date de création :15/06/2007 Date de mise à jour :15/06/2007 14:04:54 Vu / téléchargé :6 246 / 167

Auteur : pasty

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 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

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


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

15 juin 2007 14:04:54 :
modification cas buffer[pos]=buffer[pos-1]

 Sources du même auteur

Source avec Zip JEU DU TAQUIN

 Sources de la même categorie

Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro
Source avec Zip Source avec une capture SHOP MANAGER CONSOLE SUR WINDOWS par antho974
Source avec Zip JOUR DE NAISSANCE par fredg19

 Sources en rapport avec celle ci

Source avec Zip GÉNÉRATEUR DE TEXTES ALÉATOIRES COHÉRENTS (CHAÎNES DE MARKOV... par CptPingu
Source avec Zip Source avec une capture GÉNÉRATEUR FM EXPÉRIMENTAL par tontonCD
Source avec Zip SUPER MINI MP3 JOUEUR par f_l_a_s_h_b_a_c_k
Source avec Zip Source avec une capture SYNTHÈSE D'IMAGE: BRUIT DE PERLIN: TEXTURES MARBRE, BOIS... par Pistol_Pete
Source avec Zip Source avec une capture CONTROLEUR DE VOLUME SONORE EN C [ API WINDOWS ] par ordiman85

Commentaires et avis

Commentaire de max12 le 15/06/2007 13:54:05 administrateur CS

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+

Commentaire de pasty le 15/06/2007 14:11:27

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.

Commentaire de max12 le 15/06/2007 14:33:22 administrateur CS

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+

Commentaire de Neo_Fr le 15/06/2007 15:01:52

La vitesse d'une bille de paintball c'est environ 300km/h...

Commentaire de max12 le 15/06/2007 15:19:29 administrateur CS

ouais environ, mais quand tu veux ajuster ton fusil pour qu'il soit sécuritaire il te faut un chronograph. Un chronograph c'est 160$ si je peux mesurer la vitesse en tirant une balle sur un objet situé à 5 pieds environ en mesurant la distance entre les 2 pics de sons (tir et obstacle) il est possible de déduire la vitesse. Donc au lieu de payer un bras et une jambe pour un chronograph tu prends un micro et c'est réglé. Sa sert également a mesurer la précision de la vitesse selon les réglages. Sachant qu'il faut se tenir aux environs de 300 pieds/sec (324 km/h environ).

Commentaire de SnOOpss le 23/12/2008 16:22:57

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.

Commentaire de pasty le 27/12/2008 10:47:24

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.

Commentaire de itadakimace le 23/02/2010 13:50:39

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

Commentaire de ciddiju le 26/09/2010 14:46:54 9/10

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...
}

Commentaire de ciddiju le 26/09/2010 15:06:13

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

nombre aléatoire [ par obasileus ] salut,je ne trouve pas la commande qui permet de faire générer à l'ordinateur un nombre aléatoireplease help me !!!! :-)merci toujours nombre aléatoire [ par obasileus ] Salut à tous, j'ai demander il y a quelque jours comment générer un nb aléatoire. Je remerci d'ailleur Jo de m'avoir répondu. Cependant je bosse sous comment générer un chiffre de façon aléatoire [ par magicoz ] Bonjour, J'aurais souhaité savoir comment générer en C un chiffre de façon aléatoire compris entre 1 et 6 par exemple. Si possible, me fournir un exe Aléatoire [ par lainlain ] Salut tout le monde!Alors, voilà mon problème:Je cherche à faire un programme qui génère des nombres aléatoires dans une certaine plage donnée, mais j Nombre aléatoire de type Double [ par BRAUKRIS ] Impossible de génère un nombre aléatoire à virgule.J?ai utilisé la fonction rand mais elle me renvoie toujours un nombre entier.Comment doit-je faire tirage aléatoire selon une loi gaussienne [ par marmotte33 ] Je cherche à faire un petit programme en c++ permettant d'obtenir une variable aléatoire suivant une loi Gaussienne, en paramétrant la valeur moyenne reduction du bruit [ par tdeco ] Salutje cherche à réduire le bruit sur une image squi est sous forme de matrice (fichier txt).cette matrice (suite de 1 et 0) de dimension 16*16 repre Générer un nombre aléatoire [ par lan32 ] Est ce que vous savez quelle est la fonction qui permet de générer un nombre aléatoire par exemple compris entre 0 et 100.Et aussi comment faire pour Syntaxe pour un nombre aléatoire. [ par marcel6566 ] Bonjour,VC++6 MFCJe souhaiterais générer un nombre aléatoire.int m_a=0;Comment rendre m_a aléatoire entre 0 et 17 ?Avant j'utilisais random mais avec [DEBUTANT] Fonction rand () [ par kojiro2 ] G un problème avec la fonction rand dans un pti jeuke je suis en train de faire.Je veux générer un nombre aléatoire (jusque là pas de pb).Ce nombre al


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales