C#关于参数和运行程序
我希望有人能帮忙,提前谢谢你。 我正在使用C#生成一些仿真模型,用于评估系统中请求的中等平稳时间以及系统中服务站的使用程度。 我正在使用函数生成所需的数字:C#关于参数和运行程序,c#,C#,我希望有人能帮忙,提前谢谢你。 我正在使用C#生成一些仿真模型,用于评估系统中请求的中等平稳时间以及系统中服务站的使用程度。 我正在使用函数生成所需的数字: public double genTP(double miu) { Random random = new Random(); double u, x; u = (double)random.NextDouble(); x =
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);
程序p1=新程序();
双NS=1000000;
双λ=4;
双miu=10;
双STP=0;
双STS=0;
双STL=0;
双i=1;
双Ta=0;
双Tp=0;
双Dis=0;
做
{
Tp=p1.genTP(miu);
STP+=Tp;
STS+=Ta+Tp;
Dis=p1.性别(λ);
如果(Dis }当(i每次调用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(结果被截断)。
如果任何参数为浮点类型,则操作将升级为浮点除法。如果将参数更改为int,则应使用-1d(值为-1的双精度浮点),或在使用前将“miu”强制转换为双精度浮点:
x = (-1d / miu) ...
或
或者,当然,将它们都用作双精度。我更喜欢第一种方法。我将方法设置为静态,但是当我在这里插入代码时,我忘记了重新创建方法,并相应地更改main。此外,现在我得到了更高的值,如~128.943。,而且第二个值现在有点错误,它要么稍微低一点,要么稍微高一点伊格尔。你提供的作为参考的站点有一个错误,所以我仍在寻找解决方案。@Carmichael:我已经修复了答案中的链接。不管你的代码还有什么问题,我怀疑你是否真的希望每次都得到相同的数字……我声明了这个静态随机数=新随机数();在函数的帮助下,它现在可以工作了,非常感谢。@Carmichael:一般来说,这不是一个好主意。Random
不是线程安全的;现在代码中只有一个线程,但原则上我会避免将其设为静态。应用我建议的更改应该会产生相同的效果。这似乎是可行的,我声明了静态,它的工作原理与它应该的一样,非常感谢。我通常不喜欢使用随机
静态变量。随机
不是线程安全的-如果你明确表示你只在一个线程内使用它,通常会更清楚。请按照我回答中的链接讨论如何获取随机
>如果需要,我只会将引用传递到方法中。除此之外,这更清楚地表明随机数生成器实际上是该方法的依赖项。@Jon Skeet:我想这是一个折衷的问题。如果有可能在不增加随机数的情况下设计解决方案的话类在需要大量计算的过于复杂的算法的情况下,它更可取。我认为使用随机包装的想法在其他情况下是好的。@Shymep:我的解决方案不包括任何额外的类-它只是在需要的地方传递随机数生成器。我个人认为这是一个更清晰、更安全的解决方案,但它这是品味的问题。。。
x = (-1 / (double)miu) ...