Beispiel #1
0
        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);
        }