c#for循环算法
我为一个类编写的这个程序使用“随机”数字来生成作业的到达(到达[I])和服务时间(服务[I])。我目前的问题是到达时间。为了获得到达时间,我调用了一个名为指数的函数,并将返回值添加到数组中的前一个到达时间(arrival[I-1])。出于某种原因,我不明白,程序并没有使用数组的前一个值进行加法,而是使用一个看似随机的值(15001600 ect)。但我知道数组中设置的实际值都低于5。这应该是for循环中的简单数组算法,但我无法找出哪里出了问题c#for循环算法,c#,C#,我为一个类编写的这个程序使用“随机”数字来生成作业的到达(到达[I])和服务时间(服务[I])。我目前的问题是到达时间。为了获得到达时间,我调用了一个名为指数的函数,并将返回值添加到数组中的前一个到达时间(arrival[I-1])。出于某种原因,我不明白,程序并没有使用数组的前一个值进行加法,而是使用一个看似随机的值(15001600 ect)。但我知道数组中设置的实际值都低于5。这应该是for循环中的简单数组算法,但我无法找出哪里出了问题 namespace ConsoleApplicati
namespace ConsoleApplication4
{
class Program
{
static long state;
void putseed(int value)
{
state = value;
}
static void Main(string[] args)
{
Program pro = new Program();
double totals = 0;
double totald = 0;
pro.putseed(12345);
double[] arrival = new double[1000];
double[] service = new double[1000];
double[] wait = new double[1000];
double[] delay = new double[1000];
double[] departure = new double[1000];
for (int i = 1; i < 1000; i++)
{
arrival[i] = arrival[i - 1] + pro.Exponential(2.0);
if (arrival[i] < departure[i - 1])
departure[i] = departure[i] - arrival[i];
else
departure[i] = 0;
service[i] = pro.Uniform((long)1.0,(long)2.0);
totals += service[i];
totald += departure[i];
}
double averages = totals / 1000;
double averaged = totald / 1000;
Console.WriteLine("{0}\n",averages);
Console.WriteLine("{0}\n", averaged);
Console.WriteLine("press any key");
Console.ReadLine();
}
public double Random()
{
const long A = 48271;
const long M = 2147483647;
const long Q = M / A;
const long R = M % A;
long t = A * (state % Q) - R * (state / Q);
if (t > 0)
state = t;
else
state = t + M;
return ((double)state / M);
}
public double Exponential(double u)
{
return (-u * Math.Log(1.0 - Random()));
}
public double Uniform(long a, long b)
{
Program pro = new Program();
double c = ((double)a + ((double)b - (double)a) * pro.Random());
return c;
}
}
命名空间控制台应用程序4
{
班级计划
{
静态长态;
void putseed(int值)
{
状态=值;
}
静态void Main(字符串[]参数)
{
Program pro=新程序();
双倍合计=0;
双总d=0;
pro.putseed(12345);
double[]到达=新的double[1000];
double[]服务=新的double[1000];
double[]等待=新的double[1000];
double[]延迟=新的double[1000];
双倍[]出发=新双倍[1000];
对于(int i=1;i<1000;i++)
{
到达[i]=到达[i-1]+亲指数(2.0);
if(到达[i]<离开[i-1])
出发[i]=出发[i]-到达[i];
其他的
离港[i]=0;
服务[i]=专业制服((长)1.0,(长)2.0);
总计+=服务[i];
总d+=离港[i];
}
双倍平均数=总数/1000;
双平均=总d/1000;
WriteLine(“{0}\n”,平均值);
WriteLine(“{0}\n”,平均值);
Console.WriteLine(“按任意键”);
Console.ReadLine();
}
公共双随机
{
常数长A=48271;
常数长M=2147483647;
恒长Q=M/A;
常数长R=M%A;
长t=A*(状态%Q)-R*(状态/Q);
如果(t>0)
状态=t;
其他的
状态=t+M;
返回((双)状态/M);
}
公共双指数(双u)
{
return(-u*Math.Log(1.0-Random());
}
公共双人制服(长a、长b)
{
Program pro=新程序();
双c=((双)a+((双)b-(双)a)*pro.Random());
返回c;
}
}
}您没有设置到达[0]的值,它在for循环之前没有初始化,因此数组中的其他值计算错误。您的
指数方法返回的值可能非常大。非常非常大。事实上,如果你的随机值接近1,它们就会趋于无穷大
我并不惊讶你在arrival数组中的值往往很大。事实上,我希望他们会这样做
另外:尝试根据方法的功能来命名方法。你的指数方法与数学指数无关
尽量不要自己实现随机数生成器。使用.Net Framework中包含的Random
类。如果您希望始终具有相同的伪随机数序列(如您所希望的),可以使用常量作为种子。额外建议
public double Uniform(long a, long b)
{
double c = ((double)a + ((double)b - (double)a) * Random());
return c;
}
像这样更改统一函数。根据您当前的逻辑,您的输出听起来完全正确。也许你的逻辑有缺陷
我将for
循环的前三行更改为:
var ex = Exponential(2.0);
arrival[i] = arrival[i - 1] + ex;
Console.WriteLine("i = " + arrival[i] + ", i-1 = " + arrival[i-1] + ", Exponential = " + ex);
这是输出的开始和结束:
i = 0.650048368820785, i-1 = 0, Exponential = 0.650048368820785
i = 3.04412645597466, i-1 = 0.650048368820785, Exponential = 2.39407808715387
i = 4.11006720700818, i-1 = 3.04412645597466, Exponential = 1.06594075103352
i = 5.05503853283036, i-1 = 4.11006720700818, Exponential = 0.944971325822186
i = 6.77397334440211, i-1 = 5.05503853283036, Exponential = 1.71893481157175
i = 8.03325406790781, i-1 = 6.77397334440211, Exponential = 1.2592807235057
i = 9.99797822010981, i-1 = 8.03325406790781, Exponential = 1.964724152202
i = 10.540051694898, i-1 = 9.99797822010981, Exponential = 0.542073474788196
i = 10.6332298644808, i-1 = 10.540051694898, Exponential = 0.0931781695828122
....
i = 1970.86834655692, i-1 = 1968.91989881306, Exponential = 1.94844774386271
i = 1971.49302600885, i-1 = 1970.86834655692, Exponential = 0.62467945192265
i = 1972.16711634654, i-1 = 1971.49302600885, Exponential = 0.674090337697884
i = 1974.5740025773, i-1 = 1972.16711634654, Exponential = 2.40688623075635
i = 1978.14531015105, i-1 = 1974.5740025773, Exponential = 3.5713075737529
i = 1979.15315663014, i-1 = 1978.14531015105, Exponential = 1.00784647908321
这里的数学对我来说完全正确
旁注:您可以将所有额外的方法(指数法
,统一法
,等等)声明为静态法
,这样您就不必创建一个新的程序来使用它们了。到达[0]
只需0.0
,所以,调试器告诉您什么?没有使用数组的前一个值进行加法-这已经是一个可能错误的结论(假设)。尝试更清楚地说明问题,实际值与预期值。在将数组[0]设置为0.0后,我仍然得到不正确的值。指数返回的前6个值为0.25875867353176,1.85288076211496,2.80828087927641,0.6922986499867623,0.582910365473941,2.46733148844399。我从加法中得到的值是1937.010670242451937.132793422831937.43770706741937.477003758191938.112046410221938.3405899664指数
根据实际测试,保持在<10范围内+由于随机方法的实施,指数的实际最大值为21.48*u。非常糟糕的随机实现。随机函数是我必须用于类的东西。我没有创造it@DavidPothier-Eww。我反对你的教授。请不要在真实生活中使用它。是的,我没有创建任何方法,我只是应该使用它们来运行程序