C# 矩阵中元素均匀分布的算法

C# 矩阵中元素均匀分布的算法,c#,algorithm,C#,Algorithm,我需要在随机均匀分布的日期月份生成任务。例如,对于10人到10项任务,日期间隔不少于两天。不得使用周末和节假日。元素在多重性中的基本均匀随机分布,附加条件是多重性-人x月的日期。建议,我可以在哪里观看算法。通常是以某种方式决定的。然而,我必须说,一个决定我不喜欢,但没有更好的不能想。参数如下:tasksPerMonth-每月的作业数,任务之间的距离-两个相邻作业之间的最小距离,isTasksInWeekend-考虑是否周末,minDay-从这一天开始(出于各种原因,这可能不是一个月的第一天),l

我需要在随机均匀分布的日期月份生成任务。例如,对于10人到10项任务,日期间隔不少于两天。不得使用周末和节假日。元素在多重性中的基本均匀随机分布,附加条件是多重性-人x月的日期。建议,我可以在哪里观看算法。

通常是以某种方式决定的。然而,我必须说,一个决定我不喜欢,但没有更好的不能想。参数如下:tasksPerMonth-每月的作业数,任务之间的距离-两个相邻作业之间的最小距离,isTasksInWeekend-考虑是否周末,minDay-从这一天开始(出于各种原因,这可能不是一个月的第一天),listOfDays-最初为空,假日-休假和假日列表,workdaysInMonth-工作日列表,随机-空随机()。其余的,我认为,原则上,很清楚,函数代码如下所示优化任务的分布

      public void GenerateRandomTasks(int tasksPerMonth, int distanceBetweenTasks, bool isTasksInWeekend, int minDay, List<int> listOfDays, List<int> holidays, List<int> workdaysInMonth, Random random)
{
    if (tasksPerMonth == 0)
        tasksPerMonth = 1;
    var daysInMonth = workdaysInMonth.Count + holidays.Count;
    var tasksDaysInMonth = !isTasksInWeekend ? workdaysInMonth.Count : daysInMonth;
    for (int i = 0; i < tasksPerMonth; i++)
    {
        int maxDayInPeriod;
        if (i < tasksPerMonth - 1)
        {
            maxDayInPeriod = minDay + tasksDaysInMonth / tasksPerMonth;
            if (!isTasksInWeekend && holidays.Contains(maxDayInPeriod))
                maxDayInPeriod = workdaysInMonth.First(v => v > maxDayInPeriod);
        }
        else
        {
            maxDayInPeriod = daysInMonth;
            if (!isTasksInWeekend && holidays.Contains(maxDayInPeriod))
                maxDayInPeriod = workdaysInMonth.Last();
        }

        if (minDay > maxDayInPeriod)
            minDay = maxDayInPeriod;

        var day = random.Next(minDay, maxDayInPeriod);

        if ((isTasksInWeekend != true && holidays.Contains(day)))
            day = OptimizationTheDistributionOfTasks(minDay, maxDayInPeriod, listOfDays, day, holidays);

        if (day > daysInMonth)
            day = daysInMonth;

        listOfDays.Add(day);
        minDay = maxDayInPeriod;
        if (minDay <= day + distanceBetweenTasks)
            minDay = day + distanceBetweenTasks + 1;
    }
}
public void GenerateRandomTasks(int tasksPerMonth,int desk之间的距离,bool istask sinweekend,int minDay,List listOfDays,List holidays,List workdays sinmonth,Random Random)
{
如果(tasksPerMonth==0)
tasksPerMonth=1;
var daysInMonth=workdaysInMonth.Count+假日.Count;
var tasksDaysInMonth=!istaskssinweekend?workdaysInMonth。计数:daysInMonth;
对于(int i=0;iv>maxDayInPeriod);
}
其他的
{
maxDayInPeriod=daysInMonth;
如果(!istaskssinweekend&holidays.Contains(maxDayInPeriod))
maxDayInPeriod=workdaysInMonth.Last();
}
如果(minDay>maxDayInPeriod)
minDay=maxDayInPeriod;
var day=随机。下一个(minDay,maxDayInPeriod);
if((isTasksInWeekend!=true&&holidays.Contains(day)))
day=任务分布的优化(minDay、maxDayInPeriod、日期列表、day、节假日);
如果(天>天/月)
日=月内的日;
添加(天);
minDay=maxDayInPeriod;
如果(minDay p.AmountDays==listOfDays.Min(z=>z.AmountDays)).CurrDay;
}
listOfDays.Clear();
回归日;
}

祝大家好运

@chaitangayagadkari谢谢,我已经解决了我的问题。
       private int OptimizationTheDistributionOfTasks(int minDay, int maxDay, List<int> listDays, int day, List<int> holidays)
{
    var listOfDays = new List<DaysForTaskPlan>();
    for (int k = minDay; k <= maxDay; k++)
    {
        var tempCountDays = listDays.Count(d => k == d);
        if (!holidays.Contains(k))
            listOfDays.Add(new DaysForTaskPlan(k, tempCountDays));
    }
    if (listOfDays.Any())
    {
        day = listOfDays.First(p => p.AmountDays == listOfDays.Min(z => z.AmountDays)).CurrDay;
    }
    listOfDays.Clear();
    return day;
}