私がクラスのために書いているこのプログラムは、「乱数」を使用して、ジョブの到着 (arrival[i]) とサービス時間 (service[i]) を生成します。私の現在の問題は到着時間です。到着時間を取得するには、exponential という名前の関数を呼び出し、戻り値を配列内の前回の到着時間 (arrival[i-1]) に追加します。何らかの理由で、プログラムは加算に配列の以前の値を使用していませんが、一見ランダムな値 (1500,1600 ect) を使用しています。しかし、配列に設定された実際の値がすべて 5 未満であることはわかっています。これは、for ループでの単純な配列演算である必要がありますが、何が問題なのかわかりません。
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;
}
}
}