关于参数和运行程序的c#

本文关键字:运行 程序 于参数 参数 | 更新日期: 2023-09-27 18:12:51

我希望有人可以帮助,提前谢谢你。我正在使用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.1665…这个算法没问题,我100%确定,我在Matlab中尝试过类似的东西,效果很好。此外,返回的使用程度(最后一行)是ok的(大约~39.89),只有r是错误的。这可能是函数的问题,特别是应该生成数字的随机函数?


2)关于我的函数genTP,如果我将参数从double改为int,那么它最后返回0。我使用调试器来检查为什么会这样,并且我看到当该方法用(-1/miu)计算x的值时,这会自动返回0,我试图将其转换为双精度,但没有结果。我想这可能是问题的根源。

关于参数和运行程序的c#

每次调用genTP时都创建了一个新的Random实例。如果在快速连续中调用多次(就像它一样),那么它每次都会使用相同的种子。有关更多信息,请参阅我关于随机数的文章。

创建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);
    ...
}

更多的建议:

  • 在第一次使用时声明变量,使用最小范围
  • 遵循。net命名规范
  • 如果方法不使用任何状态,就不要将其作为实例方法

我更喜欢在计算类

中创建一个静态随机场
 static Random random = new Random();

现在我可以使用它,而不用考虑快速连续,我不需要把它作为一个函数参数(我不是想说它工作得更快,只是类似于数学符号)

关于你的第二个问题,这是因为编译器做一个整数除法,因为它们是两个整数。Int/Int = Int(结果被截断)。如果其中任何一个参数是浮点类型,则该操作将提升为浮点除法。如果你将arg改为int型,你应该使用-1d(值为-1的双精度型),或者在使用前将'miu'强制转换为双精度型:

x = (-1d / miu) ...

x = (-1 / (double)miu) ...

当然,也可以将它们都用作双精度对象。