class Program
{
class Rc
{
private int[] num = new int[100]; public bool rD(int ib) //判断之前是否有重复
{
for (int i = 0; i < 100; i++)
{
if (num[i] == ib)
{
Console.Write(" {0}", i);//这里是为了方便看随机了几次
return true;
}
}
return false;
}
public void rS()
{
Random r = new Random();
int d = r.Next(1, 100);
for (int i = 0; i < 100; i++)
{
while (rD(d))
{
d = r.Next(1, 101);
}
num[i] = d;
Console.Write(" \n num[{0}]={1} \n", i, num[i]);
}
} }
static void Main(string[] args)
{
Rc r = new Rc();
r.rS();
Console.Read();
}
}
1 到100的随机数不重复插入100个数组 结果的确是做到了,
但是我在想如果是要1 到 n 的随机数不重复插入 n 个数组
当这个n很大的时候 这个算法就很没效率了 由于是C# 尽量
不用指针能否有更效率的算法?
不行的话指针的算法也个我贴个吧。
{
class Rc
{
private int[] num = new int[100]; public bool rD(int ib) //判断之前是否有重复
{
for (int i = 0; i < 100; i++)
{
if (num[i] == ib)
{
Console.Write(" {0}", i);//这里是为了方便看随机了几次
return true;
}
}
return false;
}
public void rS()
{
Random r = new Random();
int d = r.Next(1, 100);
for (int i = 0; i < 100; i++)
{
while (rD(d))
{
d = r.Next(1, 101);
}
num[i] = d;
Console.Write(" \n num[{0}]={1} \n", i, num[i]);
}
} }
static void Main(string[] args)
{
Rc r = new Rc();
r.rS();
Console.Read();
}
}
1 到100的随机数不重复插入100个数组 结果的确是做到了,
但是我在想如果是要1 到 n 的随机数不重复插入 n 个数组
当这个n很大的时候 这个算法就很没效率了 由于是C# 尽量
不用指针能否有更效率的算法?
不行的话指针的算法也个我贴个吧。
while (rD(d))
{
d = r.Next(1, 101);
}这里效率不好,我们可以试想一下,n很大的时候,越往后系统就越难随机到不与之前重复的数字,
有可能出现接近死循环的等待情况,我希望能避免这种情况,请高手赐教。
{
private int[] num;
private int n;
public Rc2(int n)
{
this.n = n;
num = new int[n];
}
public void rS()
{
Random r = new Random();
int d = r.Next(1, n);
int temp;
for (int i = 0; i < n; i++)
{
num[i] = i + 1;
}
for (int i = 0; i < n; i++)
{
int b = r.Next(0, n);
temp = num[b];
num[b] = num[i];
num[i] = temp;
}
for (int i = 0; i < n; i++)
{
Console.Write("\n num[{0}] = {1} ",i,num[i]);
}
}晕死,楼上一句话就帮我把思路打开了,虽然之前没接触过洗牌算法。
感谢...............
class Rc
{
private int[] num = null;
private int MaxNumber = 0;
private Hashtable ht = null;
public Rc(int num)
{
this.num = new int[num];
this.MaxNumber = num;
ht = new Hashtable(num);
} public bool Exists(int ib) //判断之前是否有重复
{
if (ht.ContainsKey(ib))
{
return true;
}
else
{
ht.Add(ib, ib);
return false;
}
}
public void rS()
{
Random r = new Random();
int d = r.Next(1, MaxNumber);
for (int i = 0; i < MaxNumber; i++)
{
while (this.Exists(d))
{
d = r.Next(1, MaxNumber + 1);
}
num[i] = d;
//Console.Write(" \n num[{0}]={1} \n", i, num[i]);
}
} }
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString());
Rc r = new Rc(300000);
r.rS();
TimeSpan ts = DateTime.Now.Subtract(dt);
Console.WriteLine(ts.TotalMilliseconds);
Console.Read();
}
改成这样,300000平均2000耗秒左右。你原来的30000的确是慢了。