日期:2014-05-17 浏览次数:21054 次
List<string> listResult = new List<string>(); Random r = new Random(); while (listResult.Count < 10000) { List<int> listNums = new List<int>(); while (listNums.Count < 6) { int i = r.Next(0, 10); if (!listNums.Contains(i)) listNums.Add(i); } string temp = string.Join("", Array.ConvertAll<int, string>(listNums.ToArray(), Convert.ToString)); if (!listResult.Contains(temp)) listResult.Add(temp); } foreach (string s in listResult) Console.WriteLine(s);
------解决方案--------------------
一种生成不重复数的算法
在编程中经常遇到一些类似的问题,比如做一个双色球选号软件,其中6个双色球是从1到33之间选出6个数来,这6个数是不能重复的,这个问题就是我们今天要说的生成不重复数算法。算法描述如下:从M个数中选出N个数来(0
------解决方案--------------------
根据你提供的条件,从计算原理来分析,我认为最快的算法是生成1512000个抽取数的集合,然后随机抽取10000个数,抽取一个删除一个。
因为15:1这个比例不足够大。2^15=32768,32768<1512000,如果按照半数比较,平均也要15次以上,方能确定是否重复,如果按照黄金分割点速度快一些,但也很有限。
因此,虽然浪费了很多生成运算,但是却节省了更多的比较运算。
------解决方案--------------------
private void button11_Click(object sender, System.EventArgs e) { //ArrayList resultList=new ArrayList(); int number = 0; string ss = string.Empty; for(int i=0;i<10000;i++) { number = GetRandomNumber(); while(resultList.Contains(number)) { number = GetRandomNumber(); } //resultList.Add(number); ss += number.ToString() + "\r\n"; } this.textBox2.Text = ss; } Random rnd=new Random(unchecked((int)DateTime.Now.Ticks)); private int GetRandomNumber() { int number = 0,rndNumber=0; int[] numberList = {0, 1, 2, 3,4,5,6,7,8,9}; ArrayList list=new ArrayList(numberList); string str = string.Empty; for(int i=0;i<6;i++) { rndNumber = rnd.Next(0, 10 - i); str += list[rndNumber].ToString(); list.Remove(list[rndNumber]); } number = int.Parse(str); return number; }
------解决方案--------------------
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace GetRandNumber { public partial class DispForm : Form { public DispForm() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { RandomNumber rn = new RandomNumber(); rn.OnOutputMessage = DispMessage; rn.RandNumberCount = Convert.ToInt32(textBox1.Text); rn.Method1(); rn.Method2(); } private void DispMessage(string sInMessage) { StringBuilder sbMsg = new StringBuilder(textBox2.Text); sbMsg.AppendLine(sInMessage); textBox2.Text = sbMsg.ToString(); } } }