首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

随机分配的有关问题

2013-03-19 
随机分配的问题。有三件事情,要随机分配到一个月中的周六去做,有四件事情,要随机分配到一个月中的工作日去

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

怎么分配? 算法
[解决办法]
 
注释写得很清楚了,看是不是你想要的,


  /// <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);




[解决办法]
引用:
C# code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455DateTime start = new DateTime(2013, 03, 01);            DateTime end = new Dat……


有个小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
 
*/

热点排行