1

我被分配创建一个包含 100 个元素的数组并使用 rand () 函数为其分配随机值,并检查数组中是否存在重复项。我已经完成了代码并且运行良好,但我不确定它是实际检查重复项还是只是打印未找到的重复项,因为我已经运行了很多次,但它甚至一次都没有显示“找到重复值”

#include <iostream>
using namespace std;
void main ()
{
    int array1[100];
    for (int a=0; a<100; a++)
    {
        array1[a]=rand();
        cout<<array1[a]<<endl;
    }
    for(int b=0;b<100;b++)
    {
        for(int c=b+1;c<100;c++)
        {
            if(array1[b]==array1[c])
            {
                cout<<"Array contains duplicates\n";
                break;
            }
        }
    }
    cout<<"No Duplicates found"<<endl;
}
4

6 回答 6

1

由于rand()返回一个值,[0, RAND_MAX)因此其中两个在 100 个值中相等的可能性很小(RAND_MAX保证至少为 32k,但可能更大)。

您应该尝试使用模运算符缩小您生成的可能数字的范围:rand()%MAX_VALUE[0, MAX_VALUE).

实际上,通过解释pidgeonhole 原则,如果您选择MAX_VALUE < 100,您肯定必须有一个副本。

于 2012-12-02T21:44:29.397 回答
1

这就是功能和功能测试有用的地方。将您的重复检查代码移动到它自己的函数中。然后创建一个数组,使用您知道包含重复项的值进行初始化,将其传递给您的新检查函数,看看您是否得到预期的结果。

于 2012-12-02T21:44:31.943 回答
1

我建议您编写一些测试代码,而不是查看您的算法(我可能会或可能不会正确理解)。制作一个类似于 rand() 的 fake_rand() 函数,但每 10 个数字为 0,或类似的东西。让这个假函数容易理解,或者你也必须为它编写测试代码。

然后,使用它而不是真实的来测试您的算法。

测试代码是一个非常有用和强大的概念,花点时间去 google 一下。

于 2012-12-02T21:46:55.060 回答
0

正如克里斯指出的那样,使用独特是要走的路。作为一般规则,如果有库例程可以完成这项工作,请不要编写自己的循环。

#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <ostream>
#include <vector>

template <typename RandomAccessIterator>
bool hasDuplicates(RandomAccessIterator first, 
    RandomAccessIterator last)
{
    typedef typename std::iterator_traits<RandomAccessIterator>
        ::value_type value_type;

    std::vector<value_type> v(first, last);
    std::sort(v.begin(), v.end());
    return std::unique(v.begin(), v.end()) != v.end();
}

int main()
{
    const int n = 100;
    int array1[n];

    // Seeding of rand would go here

    std::for_each(array1, array1 + n, 
        [](int& x){ x = std::rand(); });

    bool b = hasDuplicates(array1, array1 + n);

    std::cout << (b ? "Array contains duplicates" :
        "No duplicates found") <<
        std::endl;

    return 0;
}
于 2012-12-02T22:19:37.917 回答
0

该代码看起来在功能上是正确的。请记住,在一组 100 个随机数(从 2^32 的总数字空间)中找到重复项的概率相当低,因此您没有找到此类实例并不奇怪。

于 2012-12-02T21:51:01.593 回答
0

唔。当没有使用不同的起始值播种时,rand 总是返回相同的序列。所以你应该用不同的种子(可能来自当前时间)调用 srand ,否则当它们在第一次运行时都不同时,它们将永远不同。

于 2012-12-02T21:52:57.210 回答