c#中唯一的随机数
本文关键字:随机数 唯一 | 更新日期: 2023-09-27 18:09:51
我正在尝试创建一个具有唯一随机数的二叉搜索树。我用SortedSet来表示我的树然后我把它做成一个数组然后我用Contains来查看某个数字是否在树中。我的问题是,我不知道如何用一种简单的方法使所有的随机数不同。我使用了Unik和namatlen_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();
主要有三种方法可以获得无冲突的随机数:
- 保留您选择的所有号码,以便您可以检查新号码与所有以前的号码。
- 创建一系列唯一的数字,洗牌,每次从结果中选择一个。
- 创建一个如此巨大的随机数,以至于碰撞的风险很小,可以忽略不计。
第二种方法与洗牌的原理相同。第三种方法用于创建GUID,它基本上是一个随机的128位值。
你可以使用Random类和HashSet来保证没有重复项。
HashSet类提供高性能的集合操作。set是不包含重复元素的集合,其元素没有特定的顺序。
E。g:
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 < ?
行以获得所需长度的集合。
您可以使用guide . newguid()或new Random().Next()
假设您希望在有限范围内唯一的数字,一种(简单但可能效率低下的)方法是创建一个包含所有可能值的列表(例如,0-99)。然后使用System。随机在0和(列表中元素的数量- 1)之间随机选择一个。从列表中获取该索引,输出它并删除该元素。如果您重复该过程,则该元素将不再生成,并且数字将是唯一的,直到您使用了所有可能的值。
创建一个随机类实例。确保它是1 !
则使用此代码
private Random random = new Random();
random.Next();