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