我有以下程序通过数组创建100个随机元素。 那100个随机值是唯一的,每个值只显示一次。
尽管使用线性搜索,它仍然会查找整个数组。 我怎样才能将 Jagged Array 加入其中,所以它只会“扫描”剩余的剩余位置? (假设我将表格保持在100个最大元素,因此,如果生成一个随机值,则该数组将保留99个元素,并使用线性搜索扫描并且... ...
我假设我必须在FoundLinearInArray的某个地方实现锯齿状数组?
希望这有任何意义。 问候。
private int ValidNumber(int[] T, int X, int Range)
{
Random RndInt = new Random();
do
{
X = RndInt.Next(1, Range + 1);
} while (FoundLinearInArray(T, X));
return X;
}/*ValidNumber*/
private bool FoundLinearInArray(int[] A, int X)
{
byte I = 0;
while ((I < A.Length) && (A[I] != X))
{
I++;
}
return (I < A.Length);
}/*FoundInArray*/
public void FillArray(int[] T, int Range)
{
for (byte I = 0; I < T.Length; I++)
{
T[I] = ValidNumber(T, I, Range);
}
}/*FillArray*/
答案 0 :(得分:1)
所以看起来你想要填充你的数组,并且你想保证它中的每个项目都是唯一的?如果是这样,请将生成的每个数字放入Hashset。关于hashset的查找是O(1),(或者可能是对数) - 你可以将一百万个项目放入其中,并且仍然具有极高性能的查找。
答案 1 :(得分:0)
我不确定这是否是您正在寻找的,但这里有一段代码,用一组范围内的一组唯一随机数填充数组。正如JMarsch建议的那样,它使用HashSet来跟踪所使用的数字。
它还会快速检查以确定问题是可解决的 - 如果Range小于数组的大小,那么您将没有足够的唯一数字来填充数组。
最后,它创建一次随机数生成器而不是多次,这样可以更好地分配数字。由于数字必须是唯一的,在这种情况下你永远不会注意到,但我认为这是一种习惯的好习惯。
private int GenerateUniqueRandomNumber(Random chaos, HashSet<int> used, int range)
{
while (true)
{
int candidate = chaos.Next(range);
if (!used.Contains(candidate))
{
used.Add(candidate);
return candidate;
}
}
}
public void FillArray(int[] array, int range)
{
if (range < array.Length)
{
throw new ArgumentException("Range is too small");
}
Random chaos = new Random();
HashSet<int> used = new HashSet<int>();
for (int i = 0; i < array.Length; i++)
{
array[i] = GenerateUniqueRandomNumber(chaos, used, range);
}
}
我希望这会有所帮助。
答案 2 :(得分:0)
static int[] FillArray(int low, int high, int count)
{
Random rand = new Random();
HashSet<int> Data = new HashSet<int>();
while (Data.Count() < count)
Data.Add(rand.Next(low, high));
return Data.ToArray();
}
这与JMarsch的建议类似。 Hashsets是要走的路。