最speed的方法从0~9,10个数字中随即抽取6个数字,生成一万个不重复的数
最speed的方法从0~9,10个数字中随即抽取6个数字,生成一万个不重复的数
[解决办法]
- C# code
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次以上,方能确定是否重复,如果按照黄金分割点速度快一些,但也很有限。
因此,虽然浪费了很多生成运算,但是却节省了更多的比较运算。
[解决办法]
- C# code
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; }
[解决办法]
[解决办法]
用了5楼的算法
DispForm.cs
- C# code
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(); } }}
[解决办法]
[code=C#][/code]
int[] range = new int[33];
for (int i = 0; i < 33; i++)//初始化范围集合,从1到33
{
range[i] = i + 1;
}
int[] result = CreateNumbers(range, 6);
for(int i=0;i<result.Length;i++)
{
Console.WriteLine("result[{0}]={1}", i, result[i]);
}
Console.ReadKey();
}
//取出不重复的6个数
static int[] CreateNumbers(int[] range, int count)
{
int[] result = new int[count];
Random random=new Random();
int index = 0;
int temp = 0;
for (int i = 0; i < count; i++)
{
index=random.Next() % (range.Length-i);
result[i] = range[index];
//将当前已使用过的数移至集合末尾,并且将末尾原来没有使用的数放到当前位置
temp = range[range.Length - 1-i];
range[range.Length - 1-i] = range[index];
range[index]=temp;
}
return result;