#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <math.h>
int main(int argc, char *argv[])
{
int i,k;
float media,varianza,p,q,p1,n1,r,rc,multiplicatoria=1,x;
printf("\ningrese p:");
scanf("%f",&p);
printf("\ningrese cuantos numeros aleatorios se generaran k:");
scanf("%d",&k);
q=(1-p);
printf("el valor de q es:%f\n",q);
media=((k*q)/p);
varianza=((k*q)/(p*p));
printf("\nla media es:%f\n",media);
printf("la varianza es:%f\n\n",varianza);
p1=(media/varianza);
n1=((media*media)/(varianza-media));
srand((unsigned)time(NULL));
for(i=1;i<=k;i++){
r=sin((float)rand());
rc=fabs(r);
multiplicatoria=(multiplicatoria*rc);
printf("el r%d es:%f\n",i,rc);
}
printf("\nmultiplicatoria de r es:%f",multiplicatoria);
x=(log(multiplicatoria))/log(q);
printf("\nnum aleatoria con bin neg. es:%f\n",x);
system("PAUSE");
return 0;
}
La verdad es que ando dándole vueltas a qué tiene que ver el código que propones con una
Distribución binomial negativa (http://es.wikipedia.org/wiki/Distribuci%C3%B3n_binomial_negativa) .
En esencia el cálculo de los pseudo-aleatorios se resume a:
Cita de: peyong3 en 15 Julio 2014, 06:37 AM
.............................................
srand((unsigned)time(NULL));
for(i=1;i<=k;i++){
r=sin((float)rand());
rc=fabs(r);
.............................................
Es decir al cálculo de sin y claro así se obtienen salidas como éstas:
Citar
el r1 es:0.988268
el r2 es:0.999706
el r3 es:0.972046
el r4 es:0.901397
el r5 es:0.876692
el r6 es:0.820528
el r7 es:0.994781
el r8 es:0.237657
el r9 es:0.772648
el r10 es:0.566853
el r11 es:0.220925
el r12 es:0.750848
el r13 es:0.743281
el r14 es:0.986598
el r15 es:0.847679
OTRA SALIDA:
el r1 es:0.358369
el r2 es:0.453992
el r3 es:0.882949
el r4 es:0.891008
el r5 es:0.766046
el r6 es:0.965927
el r7 es:0.587786
el r8 es:0.754711
el r9 es:0.939694
el r10 es:0.544640
el r11 es:0.906309
el r12 es:0.207912
el r13 es:0.809018
el r14 es:0.882949
el r15 es:0.945520
Donde se observa la preponderancia de valores superiores a 0.5 respecto a valores inferiores al mismo. Y es que al usar la función "sin" hay que recordar que, en grados sexagesimales para entenderlo mejor, para ángulos de 0-30 el valor del sin es inferior o igual a 0.5 mientras que para ángulos de 30-90 el valor es superior a 0.5. Es decir, y a lo breve, existen el doble de probabilidad de que el sin sea superior a 0.5 a que sea inferior, de ahí los resultados obtenidos.
¿No habrás querido decir otra cosa con eso de "Números aleatorios con una distribución binomial negativa"?.
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
A parte del code, si te interesa, también la tienes ahora en C++11: CPlusPlus (http://www.cplusplus.com/reference/random/negative_binomial_distribution/)