Generate random integers and binary numbers. This blocks is able to generate multiple vectors of integers or binary numbers and also multiple sequential data stream. These functions are enable with the dialogue parameters.
/* genint Scicos Random Integer Generator block * Type 4 simulation function ver 1.0 - scilab-3.0 * 3 janvier 2005 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #include "machine.h" #include <math.h> #include "scicos_block.h" /* Ce bloc est générateur de nombre entier aléatoire. Il peut générer des trains binaires * type RZ ou NRZ ou bien des nombres entiers de longueurs déterminées, signés ou non signés * * entrées régulières : néant * sorties régulières : sortie du générateur * entrée évènementielle : détermine la cadence de génération * * paramètres entiers : ipar[0..outsz[0]-1] : vecteur du nombre de bit du mot de sortie * ipar[outsz[0]..2*outsz[0]-1]: vecteur du type de générateur * * nb : Type 0: génére 1 seul bit codé NRZ * 1: génère 1 seul bit codé RZ, ou un mot non signé * 2: génère un mot codé code complément à 2 */ /* genintv_c routine de calcul de mots entiers aléatoires * * Entrées : * n : taille du vecteur de sortie (scalaire) * m : longueur des mots binaires des éléments du vecteur de sorties (vecteur) * typ : type des générateurs binaires (vecteur) * (typ=0: génére 1 seul bit codé NRZ * =1: génère 1 seul bit codé RZ, ou un mot non signé * =2: génère un mot codé code complément à 2) * Sorties : * y : vecteur de sortie * * dépendances * math.h */ void genintv_c(int *n,int *m,int *typ,double *y) { /*déclaration des variables compteurs*/ int k,i,j; for(i=0;i<(*n);i++) { switch (typ[i]) { /*Type 0 -> dédié signal NRZ*/ case 0: { y[i]=(int)((rand()&1)*2-1); break; } /*Type 1 -> entier non signé*/ case 1 : { k=1; k=k<<m[i]; j=rand(); y[i]=(j&(k-1)); break; } /*Type 2 -> entier code complémént à 2*/ case 2 : { j=rand(); j -= 2<<(m[i]-2); j &= (2<<(m[i]-1)) - 1; j -= 2<<(m[i]-2); y[i]=j; break; } break; } } return; } /*prototype*/ void genint(scicos_block *block,int flag) { /*Déclaration des variables*/ double *y; int i,j,k; int ny; /*Récupération de l'adresse du port de sortie régulier*/ y=(double *)block->outptr[0]; /*Récupération de la taille du vecteur de sortie*/ ny=block->outsz[0]; /*Le flag 1 recopie le vecteur Z dans le vecteur Y*/ if (flag==1||flag==6) { k=1; F2C(dcopy)(&ny,&block->z[0],&k,&y[0],&k); } /*Le flag 2 calcul les valeurs ou mots binaires dans Z*/ else if(flag==2||flag==4) { /*Appel binv_c*/ genintv_c(&ny,&block->ipar[0],&block->ipar[ny],&block->z[0]); } }