读书人

随机分配的有关问题

发布时间: 2013-03-19 17:22:05 作者: rapoo

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

怎么分配? 算法
[解决办法]

注释写得很清楚了,看是不是你想要的,


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

*/

读书人网 >C#

热点推荐