有三件事情,要随机分配到一个月中的周六去做,
有四件事情,要随机分配到一个月中的工作日去做,
一天只能做一件事。怎么分配?算法

解决方案 »

  1.   

     
    注释写得很清楚了,看是不是你想要的,  /// <summary>
        /// 任务分配项
        /// </summary>
        public class WorkDayInfo
        {
            public DateTime Date { get; set; }
            public Task TaskInfo { get; set; }
        }
        /// <summary>
        /// 具体任务
        /// </summary>
        public class Task
        {
            public string Desc { get; set; }
        } /// <summary>
            /// 安排任务
            /// </summary>
            /// <param name="date">月份的第一天日期比如:2013-03-01</param>
            /// <param name="workDayList">待分配到工作日的任务</param>
            /// <param name="satworkDayList">待分配到星期六的任务</param>
            /// <returns>返回分配好的任务项</returns>
            public List<WorkDayInfo> ArrangeTask(DateTime date, List<Task> workDayList, List<Task> satworkDayList)
            {
                int days = (date.AddMonths(1) - date).Days;//传入的月份有多少天
                var workDayItems = new List<int>();//工作日安排
                var satDayItems = new List<int>();//星期六安排
                var arrangeTaskItems = new List<WorkDayInfo>();
                //生成可分配任务的日期
                for (int i = 0; i < days; i++)
                {
                    DateTime current = date.AddDays(i);
                    if (current.DayOfWeek == DayOfWeek.Sunday) continue;
                    if (current.DayOfWeek == DayOfWeek.Saturday)
                    {
                        satDayItems.Add(i + 1);
                        continue;
                    }
                    workDayItems.Add(i + 1);
                }
                var rand = new Random((int)DateTime.Now.Ticks);
                //分配工作日任务
                foreach (var work in workDayList)
                {
                    int randIndex = rand.Next(workDayItems.Count);
                    int day = workDayItems[randIndex];
                    arrangeTaskItems.Add(new WorkDayInfo() { Date = date.AddDays(day - 1), TaskInfo = work });
                    workDayItems.RemoveAt(randIndex);
                }
                //分配星期六任务
                foreach (var work in satworkDayList)
                {
                    int randIndex = rand.Next(satDayItems.Count);
                    int day = satDayItems[randIndex];
                    arrangeTaskItems.Add(new WorkDayInfo() { Date = date.AddDays(day - 1), TaskInfo = work });
                    satDayItems.RemoveAt(randIndex);
                }
                return arrangeTaskItems;
            }  调有方法 var workDayList = new List<Task>()
                                             {
                                                 new Task{ Desc="工作日第一件事情"},
                                                 new Task{ Desc="工作日第二件事情"},
                                                 new Task{ Desc="工作日第三件事情"},
                                                 new Task{ Desc="工作日第四件事情"}
                                             };
                var satworkDayList = new List<Task>()
                                             {
                                                 new Task{ Desc="星期六第一件事情"},
                                                 new Task{ Desc="星期六第二件事情"},
                                                 new Task{ Desc="星期六第三件事情"},
                                             };
                var list = ArrangeTask(new DateTime(2013, 3, 1), workDayList, satworkDayList);
      

  2.   


    DateTime start = new DateTime(2013, 03, 01);
                DateTime end = new DateTime(2013, 03, 31);
                List<DateTime> saturdayList = new List<DateTime>();
                List<DateTime> workDay = new List<DateTime>();
                DateTime now = start;
                while (now <= end)
                {
                    if (now.DayOfWeek == DayOfWeek.Saturday)
                    {
                        saturdayList.Add(now);
                        now = now.AddDays(2);
                        continue;
                    }
                    if (now.DayOfWeek != DayOfWeek.Sunday)
                    {
                        workDay.Add(now);
                        now = now.AddDays(1);
                    }
                }
                Random ran = new Random();
                int index = 0;            List<DateTime> someOf3 = new List<DateTime>();
                List<DateTime> someOf4 = new List<DateTime>();
                for (int i = 0; i < 3; i++)
                {
                    index = ran.Next(0, saturdayList.Count - 1);
                    now = saturdayList[index];
                    someOf3.Add(now);
                    saturdayList.RemoveAt(index);
                }            for (int i = 0; i < 4; i++)
                {
                    index = ran.Next(0, workDay.Count - 1);
                    now = workDay[index];
                    someOf4.Add(now);
                    workDay.RemoveAt(index);
                }            Console.WriteLine("3件事分别被分到了:\r\n {0} \r\n {1} \r\n {2}",someOf3[0],someOf3[1],someOf3[2]);
                Console.WriteLine("4件事分别被分到了:\r\n {0} \r\n {1} \r\n {2} \r\n {3}", someOf4[0], someOf4[1], someOf4[2],someOf4[3]);/*
    3件事分别被分到了:
     2013/3/16 0:00:00
     2013/3/9 0:00:00
     2013/3/2 0:00:00
    4件事分别被分到了:
     2013/3/15 0:00:00
     2013/3/5 0:00:00
     2013/3/13 0:00:00
     2013/3/27 0:00:00*/
      

  3.   


    有个小BUG,如果第一天为星期天的话将会进入死循环了。DateTime start = new DateTime(2013, 03, 01);
                DateTime end = new DateTime(2013, 03, 31);
                List<DateTime> saturdayList = new List<DateTime>();
                List<DateTime> workDay = new List<DateTime>();
                DateTime now = start;
                while (now <= end)
                {
                    if (now.DayOfWeek == DayOfWeek.Saturday)
                    {
                        saturdayList.Add(now);
                        now = now.AddDays(2);
                        continue;
                    }
                    if (now.DayOfWeek != DayOfWeek.Sunday)
                    {
                        workDay.Add(now);
                        now = now.AddDays(1);
                        continue;
                    }
                    //第一天如果为星期天
                    now = now.AddDays(1);
                }
                Random ran = new Random();
                int index = 0;
     
                List<DateTime> someOf3 = new List<DateTime>();
                List<DateTime> someOf4 = new List<DateTime>();
                for (int i = 0; i < 3; i++)
                {
                    index = ran.Next(0, saturdayList.Count - 1);
                    now = saturdayList[index];
                    someOf3.Add(now);
                    saturdayList.RemoveAt(index);
                }
     
                for (int i = 0; i < 4; i++)
                {
                    index = ran.Next(0, workDay.Count - 1);
                    now = workDay[index];
                    someOf4.Add(now);
                    workDay.RemoveAt(index);
                }
     
                Console.WriteLine("3件事分别被分到了:\r\n {0} \r\n {1} \r\n {2}",someOf3[0],someOf3[1],someOf3[2]);
                Console.WriteLine("4件事分别被分到了:\r\n {0} \r\n {1} \r\n {2} \r\n {3}", someOf4[0], someOf4[1], someOf4[2],someOf4[3]);
     
    /*
    3件事分别被分到了:
     2013/3/16 0:00:00
     2013/3/9 0:00:00
     2013/3/2 0:00:00
    4件事分别被分到了:
     2013/3/15 0:00:00
     2013/3/5 0:00:00
     2013/3/13 0:00:00
     2013/3/27 0:00:00
     
    */