现有3组数,分别为:159,267,0348,分7种情况从这三组数中分别出号组成新的三位数,用数字1-7来表示每种出号方法:
1:代表159中任意出号1个,267中任意出号一个,0348中任意出号1个。如120,578,960等
2:代表159中任意出1,267中任意出2个或者159中任意出2个,267中任意出1个.如567,152等,或者其中之一出重码,如116, 577等。
3:代表159中任意出1,0348中任意出2个或者159中任意出2个,0348中任意出1个,如103,198等,或者其中之一出重码,如110,988等
4:代表267中任意出1,0348中任意出2个或者267中任意出2个,0348中任意出1个,如234,264等,或者其中之一出重码,如224,688等
5:代表159出3个或者出重码(含两位重码和三位重码),如159,115,155,999等
6:代表267出3个或者出重码(含两位重码和三位重码),如267,226,277,777等
7:代表0348中出3个或者出重码(含两位重码和三位重码),如034,048,003,448,888等除了定义三个数组,分别存放159,267,0348,再用N重N次for循环之外还有什么好招呢,请教大侠们真要for起来效率太低了这种情况类似于多个排列组合,2-4表示159,267,0348中任选两个进行组合,然后再任意其中一个任选1个或2个数字对应着另一组进行组合,5-7表示一组数字中任选1,2,3个进行组合组成一个三位数。
1:代表159中任意出号1个,267中任意出号一个,0348中任意出号1个。如120,578,960等
2:代表159中任意出1,267中任意出2个或者159中任意出2个,267中任意出1个.如567,152等,或者其中之一出重码,如116, 577等。
3:代表159中任意出1,0348中任意出2个或者159中任意出2个,0348中任意出1个,如103,198等,或者其中之一出重码,如110,988等
4:代表267中任意出1,0348中任意出2个或者267中任意出2个,0348中任意出1个,如234,264等,或者其中之一出重码,如224,688等
5:代表159出3个或者出重码(含两位重码和三位重码),如159,115,155,999等
6:代表267出3个或者出重码(含两位重码和三位重码),如267,226,277,777等
7:代表0348中出3个或者出重码(含两位重码和三位重码),如034,048,003,448,888等除了定义三个数组,分别存放159,267,0348,再用N重N次for循环之外还有什么好招呢,请教大侠们真要for起来效率太低了这种情况类似于多个排列组合,2-4表示159,267,0348中任选两个进行组合,然后再任意其中一个任选1个或2个数字对应着另一组进行组合,5-7表示一组数字中任选1,2,3个进行组合组成一个三位数。
{
int num1, num2, num3;
Random rand = new Random();
List<int> lst1 = new List<int>();
lst1.Add(1);
lst1.Add(5);
lst1.Add(9);
List<int> lst2 = new List<int>();
lst2.Add(2);
lst2.Add(6);
lst2.Add(7);
List<int> lst3 = new List<int>();
lst3.Add(0);
lst3.Add(3);
lst3.Add(4);
lst3.Add(8);
switch (Convert.ToInt32(textBox1.Text))
{
case 1:
{
num1 = lst1[rand.Next(1, 3) - 1];
num2 = lst2[rand.Next(1, 3) - 1];
num3 = lst3[rand.Next(1, 4) - 1];
MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
break;
}
case 2:
{
num1 = lst1[rand.Next(1, 3) - 1];
num2 = lst2[rand.Next(1, 3) - 1];
num3 = lst2[rand.Next(1, 3) - 1];
int num4, num5, num6;
num4 = lst1[rand.Next(1, 3) - 1];
num5 = lst2[rand.Next(1, 3) - 1];
num6 = lst2[rand.Next(1, 3) - 1];
List<string> lstTemp = new List<string>();
lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
MessageBox.Show(lstTemp[rand.Next(1, 2)]);
break;
}
case 3:
{
// ...
break;
}
case 4:
{
// ...
break;
}
case 5:
{
// ...
break;
}
case 6:
{
// ...
break;
}
case 7:
{
// ...
break;
}
default: break;
}
}
case 2:
{
num1 = lst1[rand.Next(1, 3) - 1];
num2 = lst1[rand.Next(1, 3) - 1];
num3 = lst2[rand.Next(1, 3) - 1];
int num4, num5, num6;
num4 = lst1[rand.Next(1, 3) - 1];
num5 = lst2[rand.Next(1, 3) - 1];
num6 = lst2[rand.Next(1, 3) - 1];
List<string> lstTemp = new List<string>();
lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
MessageBox.Show(lstTemp[rand.Next(1, 2)]);
break;
}
static int num1, num2, num3;
static Random rand = new Random();
static List<int> lst1 = new List<int>();
static List<int> lst2 = new List<int>();
static List<int> lst3 = new List<int>();
private void button1_Click(object sender, EventArgs e)
{
lst1.Add(1);
lst1.Add(5);
lst1.Add(9);
lst2.Add(2);
lst2.Add(6);
lst2.Add(7);
lst3.Add(0);
lst3.Add(3);
lst3.Add(4);
lst3.Add(8);
switch (Convert.ToInt32(textBox1.Text))
{
case 1:
{
Show1();
break;
}
case 2:
{
Show2();
break;
}
case 3:
{
Show3();
break;
}
case 4:
{
Show4();
break;
}
case 5:
{
Show5();
break;
}
case 6:
{
Show6();
break;
}
case 7:
{
Show7();
break;
}
default: break;
}
} private static void Show1()
{
num1 = GetFromListByListNum(1);
num2 = GetFromListByListNum(2);
num3 = GetFromListByListNum(3);
MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
}
private static void Show2()
{
num1 = GetFromListByListNum(1);
num2 = GetFromListByListNum(2);
num3 = GetFromListByListNum(2);
int num4, num5, num6;
num4 = GetFromListByListNum(1);
num5 = GetFromListByListNum(1);
num6 = GetFromListByListNum(2);
List<string> lstTemp = new List<string>();
lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
MessageBox.Show(lstTemp[rand.Next(0, 2)]);
}
private static void Show3()
{
num1 = GetFromListByListNum(1);
num2 = GetFromListByListNum(3);
num3 = GetFromListByListNum(3);
int num4, num5, num6;
num4 = GetFromListByListNum(1);
num5 = GetFromListByListNum(1);
num6 = GetFromListByListNum(3);
List<string> lstTemp = new List<string>();
lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
MessageBox.Show(lstTemp[rand.Next(0, 2)]);
}
private static void Show4()
{
num1 = GetFromListByListNum(2);
num2 = GetFromListByListNum(3);
num3 = GetFromListByListNum(3);
int num4, num5, num6;
num4 = GetFromListByListNum(2);
num5 = GetFromListByListNum(2);
num6 = GetFromListByListNum(3);
List<string> lstTemp = new List<string>();
lstTemp.Add(string.Format("{0}{1}{2}", num1, num2, num3));
lstTemp.Add(string.Format("{0}{1}{2}", num4, num5, num6));
MessageBox.Show(lstTemp[rand.Next(0, 2)]);
}
private static void Show5()
{
num1 = GetFromListByListNum(1);
num2 = GetFromListByListNum(1);
num3 = GetFromListByListNum(1);
MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
}
private static void Show6()
{
num1 = GetFromListByListNum(2);
num2 = GetFromListByListNum(2);
num3 = GetFromListByListNum(2);
MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
}
private static void Show7()
{
num1 = GetFromListByListNum(3);
num2 = GetFromListByListNum(3);
num3 = GetFromListByListNum(3);
MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
} // 表示从第几个组里抽随机数
private static int GetFromListByListNum(int listNum)
{
switch (listNum)
{
case 1:
return lst1[rand.Next(0, 3)];
case 2:
return lst2[rand.Next(0, 3)];
case 3:
return lst3[rand.Next(0, 4)];
default:
return 0;
}
}
// 楼主的七种排列是有规律的,假设三个数组的组号分别为1,2,3,那么排出的肯定是111,123,133这些,总之不会出现211,321这种前面的组号比后面的组号大的情况,如果是从七种中随机抽一种的话,可以精简成这样,下面的算法包括了楼主所有可能出现的排列中会出现的数字组合
private static List<int> lst1 = new List<int>();
private static List<int> lst2 = new List<int>();
private static List<int> lst3 = new List<int>();
private static Random rand = new Random();
private static int max = 1;// 用来记录当前组号
private void button1_Click(object sender, EventArgs e)
{
max = 1;// 每按一次按钮就重置一次数字
lst1.Add(1);
lst1.Add(5);
lst1.Add(9);
lst2.Add(2);
lst2.Add(6);
lst2.Add(7);
lst3.Add(0);
lst3.Add(3);
lst3.Add(4);
lst3.Add(8);
ShowResault();
} private static void ShowResault()
{ int num1 = GetFromListByListNum();
int num2 = GetFromListByListNum();
int num3 = GetFromListByListNum();
MessageBox.Show(string.Format("{0}{1}{2}", num1, num2, num3));
}
// 表示从第几个组里抽随机数
private static int GetFromListByListNum()
{
max = rand.Next(max, 4);// 这里就是实现后面的组号比前面的组号小的关键地方,前一个数字所在的组号总是比后一个数字所在的组号小,假设第一个组号为2,那么后面的两个只会是2或3,而不会出现1,即只会出现222,223,233的情况
switch (max)
{
case 1:
return lst1[rand.Next(0, 3)];
case 2:
return lst2[rand.Next(0, 3)];
case 3:
return lst3[rand.Next(0, 4)];
default:
throw new Exception("没有这个组。");
}
}
private static bool added = false;// 表示列表里是否已添加有数据,如果有,则不再添加
private void button1_Click(object sender, EventArgs e)
{
max = 1;// 每按一次按钮就重置一次数字
if (!added)// 只在第一次添加
{
lst1.Add(1);
lst1.Add(5);
lst1.Add(9);
lst2.Add(2);
lst2.Add(6);
lst2.Add(7);
lst3.Add(0);
lst3.Add(3);
lst3.Add(4);
lst3.Add(8);
added = true;
} ShowResault();
}
// 楼主的七种排列是有规律的,假设三个数组的组号分别为1,2,3,那么排出的肯定是111,123,133这些,总之不会出现211,321这种前面的组号比后面的组号大的情况,如果是从七种中随机抽一种的话,可以精简成这样,下面的算法包括了楼主所有可能出现的排列中会出现的数字组合 /// <summary>
/// 用来存储数组
/// </summary>
private static List<List<int>> lst = new List<List<int>>();
/// <summary>
/// 第一组数据
/// </summary>
private static List<int> lst1 = new List<int>();
/// <summary>
/// 第二组数据
/// </summary>
private static List<int> lst2 = new List<int>();
/// <summary>
/// 第三组数据
/// </summary>
private static List<int> lst3 = new List<int>();
/// <summary>
/// 用于随机抽取数字
/// </summary>
private static Random rand = new Random();
/// <summary>
/// // 用来记录当前组号
/// </summary>
private static int max = 1;
/// <summary>
/// 表示列表里是否已添加有数据,如果有,则不再添加
/// </summary>
private static bool added = false;
/// <summary>
/// 用来存储组合数字
/// </summary>
private static StringBuilder sb = new StringBuilder(); /// <summary>
/// 单击按钮事件,以便显示抽取出来的组合数字
/// </summary>
/// <param name="sender">sender</param>
/// <param name="e">e</param>
private void button1_Click(object sender, EventArgs e)
{
max = 1;// 每按一次按钮就重置一次数字 if (!added)// 只在第一次添加
{
// 将数组装入列表
lst.Add(lst1);
lst.Add(lst2);
lst.Add(lst3); // 将第一组数据装入列表作为数组
lst1.Add(1);
lst1.Add(5);
lst1.Add(9); // 将第二组数据装入列表作为数组
lst2.Add(2);
lst2.Add(6);
lst2.Add(7); // 将第三组数据装入列表作为数组
lst3.Add(0);
lst3.Add(3);
lst3.Add(4);
lst3.Add(8);
added = true;// 将布尔值设为true,表示数据初始化完毕
} ShowResault();// 显示结果
} /// <summary>
/// 显示结果
/// </summary>
private static void ShowResault()
{
if (sb.Length > 0)
{
sb.Clear();// 清空,以便重用
}
for (int i = 0; i < lst.Count; i++)
{
sb.Append(GetNumberFromList());
}
MessageBox.Show(sb.ToString());
} /// <summary>
/// 表示从第几个组里抽随机数
/// </summary>
/// <returns>随机数</returns>
private static int GetNumberFromList()
{
max = rand.Next(max, lst.Count + 1);// 这里就是实现后面的组号比前面的组号小的关键地方,前一个数字所在的组号总是比后一个数字所在的组号小,假设第一个组号为2,那么后面的两个只会是2或3,而不会出现1,即只会出现222,223,233的情况
// 如果还有别的数组,请楼主自行添加case
switch (max)
{
case 1:
return lst1[rand.Next(0, 3)];
case 2:
return lst2[rand.Next(0, 3)];
case 3:
return lst3[rand.Next(0, 4)];
default:
throw new Exception("没有这个组。");
}
}