我希望有人可以提供帮助,谢谢你提前。 我正在使用C#生成一些模拟模型,用于评估系统中请求的中等静止时间以及该服务站从系统中的使用程度。 我正在使用一个函数来生成所需的数字:
public double genTP(double miu)
{
Random random = new Random();
double u, x;
u = (double)random.NextDouble();
x = (-1 / miu) * Math.Log(1 - u);
return x;
}
这是主要的:
Program p1 = new Program();
double NS = 1000000;
double lambda = 4;
double miu = 10;
double STP = 0;
double STS = 0;
double STL = 0;
double i = 1;
double Ta = 0;
double Tp = 0;
double Dis = 0;
do
{
Tp = p1.genTP(miu);
STP += Tp;
STS += Ta + Tp;
Dis = p1.genDIS(lambda);
if (Dis < Ta + Tp)
{
Ta = Ta + Tp - Dis;
}
else
{
STL += Dis - (Ta + Tp);
Ta = 0;
}
i++;
} while (i <= NS);
Console.WriteLine(STS / NS);
Console.WriteLine((STP/(STP+STL))*100);
1)返回的中等静止时间(即r)是错误的,我得到的值如0.09 ..但我应该得到类似~0.165的东西..算法没问题,我100%肯定,我试过在Matlab中有类似的东西,这很好。返回的使用程度(最后一行)也没问题(约为39.89),只有r是错误的。这可能是函数的问题,尤其是应该生成数字的随机函数吗?
2)关于我的函数genTP,如果我将参数从double更改为int,那么它在结尾返回0。我用调试器检查为什么会这样,我看到当方法用(-1 / miu)计算x的值时,它会自动返回0,我试图强制转换为double但没有结果。我当时认为这可能是问题的根源。
答案 0 :(得分:3)
每次致电Random
时,您都会创建genTP
的新实例。如果快速连续多次调用它(原样),那么每次都会使用相同的种子。有关详细信息,请参阅my article on random numbers。
创建Random
的单个实例并将其传递给方法:
private static double GenerateTP(Random random, double miu)
{
double u = random.NextDouble();
return (-1 / miu) * Math.Log(1 - u);
}
和...
Random random = new Random();
do
{
double tp = GenerateTP(random, miu);
...
}
还有一些建议:
答案 1 :(得分:2)
我更喜欢在计算类
中创建一个静态随机字段 static Random random = new Random();
现在我可以在不考虑快速连续的情况下使用它而且我不需要将它作为函数参数给出(我不是说它的工作速度更快但是与数学符号类似)
答案 2 :(得分:0)
关于你的第二个问题,这是因为编译器进行整数除法,因为它们是两个整数。 int / int = int(结果被截断)。 如果任何args是浮点类型,则操作将提升为浮点除法。如果将arg更改为int,则应使用-1d(值为-1的double),或者在使用前将'miu'转换为double:
x = (-1d / miu) ...
或
x = (-1 / (double)miu) ...
或者,当然,将它们用作双打。我更喜欢第一种方式。