首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

帮小弟我详细解释一上这个高斯算法,多谢!

2012-09-21 
帮我详细解释一下这个高斯算法,谢谢!急float Gauss(float min, float max){srand(500)int a rand(), b

帮我详细解释一下这个高斯算法,谢谢!急
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;
}

[解决办法]

先从随机数的原理谈起. 
计算机的随机数都是由伪随机数,即是由小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)之间

热点排行