3

我有以下程序通过数组创建 100 个随机元素。这 100 个随机值是唯一的,每个值只显示一次。

尽管使用线性搜索,它会不断查找整个数组。我怎样才能将锯齿状阵列放入其中,所以它只“扫描”剩下的剩余位置?(假设我将表格保持在 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*/
4

3 回答 3

1

所以看起来你想填充你的数组,并且你想保证其中的每个项目都是唯一的?如果是这样,请将您生成的每个数字放入一个 Hashset 中。哈希集上的查找是 O(1),(或者可能是对数)——您可以将一百万个项目放入其中,并且仍然具有极高的性能查找。

于 2010-03-11T16:05:10.107 回答
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);
        }
    }

我希望这有帮助。

于 2010-03-27T04:35:31.897 回答
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 的建议。哈希集是要走的路。

于 2010-03-27T04:47:48.550 回答