public static bool GetRandomStartDurationTimeFrequency(int distribution, Time tstart, int min, int max, Random random, out Time startTime) { int start = TimeOfDayToDistribution(tstart); float[][] pdf = Distributions[distribution].Durations; if (start == Scheduler.StartTimeQuanta) { start = 0; } float rand = (float)random.NextDouble(); float pdfFactor = 0.0f; for (int i = min; i <= max; ++i) { pdfFactor += pdf[start][i]; } if (pdfFactor == 0) { startTime = Time.Zero; return(false); } rand *= pdfFactor; float cdf = 0.0f; for (int i = min; i <= max; ++i) { cdf += pdf[start][i]; if (rand < cdf) { if (i == 0) { startTime = Distribution.DistributionToDuration(1); } else { startTime = Distribution.DistributionToDuration(i);; } if (startTime == Time.Zero) { throw new XTMFRuntimeException("Tried to create a zero duration episode!"); } return(true); } } // if we get here, it was the last one but off due to rounding errors startTime = Distribution.DistributionToDuration(max); return(true); }