float Gauss(float min, float max)
{
     srand(500);
int a = rand(), b = rand(), c = rand(), d = rand();
int x = a + b + c + d;
double y = (x*sqrt(3))/RAND_MAX-sqrt(12);
double mid = (min + max)/2;
float z = (float)(mid + (max - mid)*y/(2*sqrt(3)));
return z;
}

解决方案 »

  1.   


    先从随机数的原理谈起. 
    计算机的随机数都是由伪随机数,即是由小M多项式序列生成.产生每个小序列都有一个初始值,即随机种子. 
    srand()产生随机种子. 
    rand()产生随机数 
    要保证计算机产生不相同的随机数,应保证它们的随机种子是不一样的. srand(   (unsigned)time(   NULL   )   ); 就是以时间做为随机种子,因为每次你运行的时间总是不一样的. 
    a/b/c/d为产生的四个随机数
    x为四个随机数之和
    y = (x*sqrt(3))/RAND_MAX-sqrt(12);RAND_MAX是VC中stdlib.h中宏定义的一个字符常量:   
    #define RAND_MAX 0x7FFF   
    其值最小为32767,最大为2147483647   
    通常在产生随机小数时可以使用RAND_MAX。 
    x/RAND_MAX介于0-4(4个随机数之和最大为4)
    sqrt(12)=2*sqrt(3);
    所以y的取值介于-2*sqrt(3)到2*sqrt(3);
    double mid = (min + max)/2;
    这句mid为min和max的平均值,不过提醒你min和max也是math.h中秋最大最小值的函数,所以你最好改变变量名称。float z = (float)(mid + (max - mid)*y/(2*sqrt(3)));
    这句不用我说了吧
    y的取值介于-2*sqrt(3)到2*sqrt(3);
    y/(2*sqrt(3))介于-1,1
    z则介于(2*mid-max,max)之间
      

  2.   

    z则介于(2*mid-max,max)之间
    2*mid展开,z介于(min,max)
    其实z就是min和max之间的一个随机数
      

  3.   

    在麻烦一下,为啥用sqrt(3),而且我用1代替sqrt(3)时,结果有点不同??