将随机数分配给数组并检查重复项

时间:2012-12-02 21:39:43

标签: c++ visual-c++

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

#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;
}

6 个答案:

答案 0 :(得分:1)

由于rand()返回[0, RAND_MAX)中的值,因此只有100个值中的两个值不太可能相等(RAND_MAX保证至少为32k但可能很多更大)。

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

实际上,如果您选择MAX_VALUE < 100,则必须通过解释pidgeonhole principle来确定您的副本。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我建议您编写一些测试代码,而不是检查您的算法(我可能或可能不能正确理解)。创建一个像rand()一样工作的fake_rand()函数,但是每10个数字都是0,或类似的东西。使虚假功能非常易于理解,或者您也必须为其编写测试代码。

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

测试代码是一个非常有用和强大的概念,需要一些时间去谷歌。

答案 3 :(得分:0)

代码看起来功能正确。请记住,在一组100个随机数(从2 ^ 32的总数字空间)中找到重复项的概率相当低,因此您没有找到这样的实例并不过于令人惊讶。

答案 4 :(得分:0)

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

答案 5 :(得分: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;
}