C#关于一个随机取数的问题,求高手解答。最好给写一下源代码。

做一个随机查岗的小程序,一共有37个岗位,有测试工,软件员,经理,副经理,绘图员等等一共37个岗位,这三十七个岗位从今年九月一号开始,每四天一个循环,每天随机抽查10个岗位,其中每天必查软件员这个岗位,剩下每天再抽9个,这样四天正好查完37个岗。求高手帮写一下核心代码啊,C#语言,刚才辛辛苦苦赚了10分,我全给了。求帮写下啊。

写了一段程序供你参考,可以直接运行,性能上还可以再优化。

    public class WorkShift
    {
        public static void Main(string[] args)
        {
            List<Job> randomCheckJobList = new List<Job>();

            // 初始化36个测试岗位。            
            for (int i = 0; i < 36; i++)
            {
                randomCheckJobList.Add(new Job { Name = "岗位" + (i + 1), IsRequired = false });
            }

            // 每天检查的岗位为10个,去掉一个必查的那么随机抽查的为9个岗位。
            int randomCheckAmountPerDay = 9;

            int day = 1;

            while (randomCheckJobList.Count > 0)
            {
                // 保存当天抽检岗位的数组。
                Job[] jobs = null;

                // 剩余的工作少于或等于每天抽检的岗位数量,则不需要抽检。
                if (randomCheckJobList.Count <= randomCheckAmountPerDay)
                {
                    jobs = randomCheckJobList.ToArray();
                }
                else
                {
                    // 获取每天抽检的岗位随机索引
                    int[] jobsIndex = GetNonRepeatedNumber(randomCheckAmountPerDay, randomCheckJobList.Count);
                    jobs = new Job[jobsIndex.Length];
                    for (int i = 0; i < jobsIndex.Length; i++)
                    {
                        // 将索引的岗位放到抽检岗位数组中
                        jobs[i] = randomCheckJobList[jobsIndex[i]];
                    }
                }

                // 打印当天抽检的岗位。
                PrintJobsToCheck(day, jobs);

                // 从随机抽检岗位列表中移除已经抽检过的岗位。
                for (int i = 0; i < jobs.Length; i++)
                {
                    randomCheckJobList.Remove(jobs[i]);
                }

                day++;
            }

            Console.Read();
        }
        
        // 打印抽检的岗位
        static void PrintJobsToCheck(int day, Job[] jobs)
        {
            Console.WriteLine("==================第" + day + "天抽查岗位=======================");
            foreach (var job in jobs)
            {
                Console.WriteLine(job.Name);
            }
            Console.WriteLine();
        }

        // 获取不重复随机数
        static int[] GetNonRepeatedNumber(int count, int maxValue)
        {
            Random random = new Random();
            int[] retNumbers = new int[count];

            int index = 0;
            while (index < count)
            {
                int radNumber = random.Next(0, maxValue);
                if (retNumbers.Contains(radNumber))
                {
                    continue;
                }
                retNumbers[index] = radNumber;
                index++;
            }

            return retNumbers;
        }
    }

    // 岗位
    public class Job
    {
        // 岗位名称
        public string Name { get; set; }

        // 没有用。
        public bool IsRequired { get; set; }
    }

 运行结果

追问

可我要固定每天程序员要抽出来呀,怎么写呢,最好能运行哒。学自动化的,来了计算机公司,帮帮忙呀,正在学习中。。。

追答

换个角度考虑,程序员都已经固定要检查了,为什么还要通过随机的方式抽检呢。把程序员岗位直接添加到抽检岗位数组中就可以了。

追问

程序员加在哪啊?我是个菜鸟,能不能帮我把程序员加进来,可以完整运行出结果的。。。。帮帮忙啦,大好人

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-23
其实就是去掉软件员,共36个岗位随机抽取,不要重复,并且把抽过的做记录,当都抽取过后,就重置从新开始。
private void button3_Click(object sender, EventArgs e)
{

string[] checkname = { "你的岗位名称36个","" };
int[] check_number=new int[36];
Random r = new Random((int)DateTime.Now.Ticks);
int temp = 0;

for(int i=0;i<36;i++)
{
while (true)
{
bool break_bz = false;
temp = r.Next(37);
for (int ii = 0; ii < 36; ii++)
{
if (check_number[ii] == temp)
{
break_bz = true;
break;
}
}
if (break_bz == false)
{
check_number[i] = temp;
break;
}
}
}
string mess="";
for(int i=0;i<36;i++)
{
if(i%9==0)
{
mess += "第" + (((i + 1) / 9) + 1) + "天为:软件员,";
}
mess = mess.Replace(",第", " 第");
mess+=check_number[i]+","; //显示编号
//mess += checkname[check_number[i]] + ",";//显示名称需要上面的 岗位名称完好
}
mess = mess.Substring(0, mess.Length - 1);
MessageBox.Show(mess);

}
第2个回答  2013-08-23

简单写了一下,参考:

// 初始化37个岗位
string[] arr = new string[37];
arr[0] = "软件员";// 必查
for (int i = 1; i < arr.Length; i++)
{
    arr[i] = "岗位" + i.ToString();
}

HashSet<string> today = new HashSet<string>();// 今天的10个岗位
today.Add(arr[0]);
Random rnd = new Random(Guid.NewGuid().GetHashCode());
for (int i = 1; i < 10; i++)
{
    int idx = rnd.Next(1, 37); // 随机获取1~36之间的一个值(1<=返回值<37)
    while (today.Contains(arr[idx]))
        idx = rnd.Next(1, 37);
    today.Add(arr[idx]);
}
//today就是取得的10个抽查岗位了
//再把这10个数据,存储在文件里,第二天加载这个文件,从arr里把文件里的数据移除,再随机就ok

追问

没分了,不能给追加分了,能不能帮我把这个怎么加载和移除的写下啊。刚毕业来公司的菜鸟,哎,求哥帮忙呀。
//再把这10个数据,存储在文件里,第二天加载这个文件,从arr里把文件里的数据移除,再随机就ok

追答// 初始化37个岗位
string[] arr = new string[37];
arr[0] = "软件员";// 必查
for (int i = 1; i < arr.Length; i++)
{
arr[i] = "岗位" + i.ToString();
}

// 加载前几天查过的数据
string file = @"c:\tmp.txt";
HashSet<string> old = new HashSet<string>();
if (File.Exists(file))
{
using (StreamReader sr = new StreamReader(file, Encoding.UTF8))
{
while (!sr.EndOfStream)
old.Add(sr.ReadLine());
}
}

// 抽取今天的岗位
HashSet<string> today = new HashSet<string>();// 今天的10个岗位
today.Add(arr[0]);
Random rnd = new Random(Guid.NewGuid().GetHashCode());
for (int i = 1; i < 10; i++)
{
int idx = rnd.Next(1, 37); // 随机获取1~36之间的一个值(1<=返回值<37)
while (today.Contains(arr[idx]) && old.Contains(arr[idx]))
idx = rnd.Next(1, 37);
today.Add(arr[idx]);
}

//today就是取得的10个抽查岗位了

// 如果4天到了(即抽查数大于总岗位时),删除文件,从头开始
if (old.Count + today.Count >= arr.Length)
File.Delete(file);
else
{
//再把抽查过的数据存入文件
using (StreamWriter sr = new StreamWriter(file, true, Encoding.UTF8))
{
foreach (string s in today)
{
sr.WriteLine(s);
}
}
}

本回答被提问者采纳
第3个回答  2013-08-23
这个其实很简单啊。
我不知道你会不会写随机取值代码
要用ArrayListaList
ArrayList aList=new ArrayList();
aList.Add("测试工");
aList.Add("经理");
aList.Add("副经理");
aList.Add("XXXXX");
aList.Add("XXXXX");
.............................
-------不要加入软件员 ,因为必查软件员这个岗位。
int len= aList.length;
Random rand=new Random(len);
--下面r是个随机数。
int r=rand.Next();
---下面data就是根据随机数 r 取出的值
string data=aList[r];
--下面是arrrlist里面移除掉这个值
aList.RemoveAt[r];

-----之后怎么写不需要我说了吧,直接循环好了!追问

我是刚毕业来公司的菜鸟,大学学自动化的,正在自学中,哎,求哥帮忙呀。剩下怎么循环呀

追答

主方法里面代码如下:
ArrayList aList=new ArrayList();
aList.Add("测试工");
aList.Add("经理");
aList.Add("副经理");
aList.Add("XXXXX");-----一共36条数据
-------不要加入软件员 ,因为必查软件员这个岗位。
List [] list=new List [10];
list[0]="软件员";
for (int i=1;i<=9;i++)
{
Random rand=new Random(aList.Length);
int getNo =rand.Next();
List[i] = aList[getNo ].ToString();
aList..RemoveAt[getNo];
}

相似回答