//随机数类
public static class RandomEX
{
public static double Seed;
public static int NormSumCount = 12;
const double s = 65536;
const double u = 2053;
const double v = 13849;
//0~1之间的随机数
public static double Uniform()
{
int m = (int)(Seed / s);
Seed = Seed - m * s;
Seed = u * Seed + v;
m = (int)(Seed / s);
Seed = Seed - m * s;
double p = Seed / s;
return p;
}
//0~1之间的随机数列表
public static List<double> UniformList(int Count)
{
List<double> rslt = new List<double>();
for (int i = 0; i < Count; i++)
{
Seed = u * Seed + v;
int m = (int)(Seed / s);
Seed = Seed - m * s;
rslt.Add(Seed / s);
}
return rslt;
}
/// <summary>
/// 获取整形随机数,必须先选择Seed值,并且Seed值只能是正奇数。
/// </summary>
/// <returns></returns>
public static int UniInt(int a ,int b)
{
int k = b - a + 1;
int L = 2;
while (L < k) L += L;
int m = 4* L;
k =(int) Seed;
int i = 1;
int p=0;
while (i <= 1)
{
k = 5 * k;
k = k % m;
L = k / 4 + a;
if (L <= b)
{
p = L;
i++;
}
Seed = k;
}
return p;
}
//产生任意区间整形随机数序列,seed必须选择正奇数。
public static List<int> UniIntList(int a, int b, int n)
{
List<int> rslt = new List<int>();
int k = b - a + 1;
int L = 2;
while (L < k) L += L;
int m = 4 * L;
k = (int)Seed;
int i = 0;
while (i < n)
{
k = 5 * k;
k = k % m;
L = k / 4 + a;
if (L <= b)
{
rslt.Add(L);
i++;
}
}
Seed = k;
return rslt;
}
//产生正态分布随机数
public static double Normal(double miu,double sigma)
{
double sum = 0;
int m;
for (int i = 0; i < RandomEX.NormSumCount; i++)
{
Seed = Seed * u + v;
m = (int)( Seed /s);
Seed = Seed - m * s;
sum += Seed / s;
}
sum = miu + sigma * (sum - RandomEX .NormSumCount /2);
return (sum);
}
//生成正态分布随机数列表
public static List<double> NormalList(double miu, double sigma, double n)
{
double sum;
int m;
List<double> rslt = new List<double>();
for(int k=0; k<n;k++)
{
sum = 0;
for (int i=0;i<RandomEX .NormSumCount;i++)
{
Seed = Seed * u + v;
m = (int)(Seed / s);
Seed -= m * s;
sum += Seed / s;
}
rslt.Add(miu + sigma * (sum - RandomEX.NormSumCount / 2));
}
return rslt;
}
public static double Randomize( bool isOddOnly=true )
{
int curseed = DateTime.Now.Millisecond;
if (isOddOnly)
curseed = curseed * 2 - 1;
Seed = curseed;
return Seed;
}
}//随机数类结束