我正在尝试使用唯一的随机数创建二叉搜索树。我使用SortedSet来表示我的树,然后我将它变成一个数组,然后我使用Contains来查看树中是否有某个数字。我的问题是我无法弄清楚如何以一种简单的方式获得所有随机数。我使用了Unik和Nålen_Unik方法,但在此代码中它只为数组生成1个数字
Random random = new Random();
Program Tal = new Program();
string nål = Tal.Nålen_Unik();
string TalIArray = Tal.Unik();
bool found = false;
SortedSet<string> Tree = new SortedSet<string>();
for (int x = 0; x < 50000; x++)
{
Tree.Add(TalIArray);
}
int y = 0;
string[] TreeArray = Tree.ToArray<string>();
while (y < TreeArray.Length)
{
Console.WriteLine(TreeArray[y]);
y = y + 1;
}
private string Unik()
{
int maxSize = 4;
char[] chars = new char[10000];
string a;
a = "0123456789";
chars = a.ToCharArray();
int size = maxSize;
byte[] data = new byte[1];
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
crypto.GetNonZeroBytes(data);
size = maxSize;
data = new byte[size];
crypto.GetNonZeroBytes(data);
StringBuilder result = new StringBuilder(size);
foreach (byte b in data)
{
result.Append(chars[b % (chars.Length - 1)]);
}
return result.ToString();
}
private string Nålen_Unik()
{
int maxSize = 1;
char[] chars = new char[62];
string a;
a = "0123456789";
chars = a.ToCharArray();
int size = maxSize;
byte[] data = new byte[1];
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
crypto.GetNonZeroBytes(data);
size = maxSize;
data = new byte[size];
crypto.GetNonZeroBytes(data);
StringBuilder result = new StringBuilder(size);
foreach (byte b in data)
{
result.Append(chars[b % (chars.Length - 1)]);
}
return result.ToString();
答案 0 :(得分:3)
主要有三种方法用于获取没有冲突的随机数:
第二种方法与改组一副纸牌的原理相同。在创建GUID时使用第三种方法,它基本上是一个随机的128位值。
答案 1 :(得分:2)
您可以使用Random课程和HashSet来保证不会有重复的内容。
HashSet类提供高性能的集合操作。集合是一个不包含重复元素的集合,其元素没有特定的顺序。
例如:
HashSet<int> t = new HashSet<int>();
Random r = new Random();
while(t.Count < 50)//or the desired length of 't'
{
t.Add(r.Next(0,1000));//adjust min/max as needed
}
foreach (int i in t)
{
Console.WriteLine(i);
}
Console.Read();
将为您提供50个保证唯一随机整数的集合。
由于集合中的元素数量不是此问题的要求,因此即使提及也似乎无关紧要,但如果此是要求,您只需将行t.Count < ?
修改为获得一组所需的长度。
答案 2 :(得分:0)
您可以使用Guid.NewGuid()或新的Random()。Next()
答案 3 :(得分:0)
假设您想要在有限范围内使用唯一数字,一种(简单但可能效率低)的方法是创建所有可能值的列表(例如,0-99)。然后使用System.Random在0和(列表中的元素数量-1)之间选择一个随机数。从列表中获取该索引,输出它并删除该元素。如果您重复此过程,则在您使用所有可能的值之前,将无法再生成该元素,并且数字将是唯一的。
答案 4 :(得分:-1)
创建一个Random类的实例。确保它是一个!
然后使用此代码
private Random random = new Random();
random.Next();