读书人

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

发布时间: 2012-09-21 15:47:26 作者: rapoo

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

读书人网 >VC/MFC

热点推荐