我被赋予了一个赋值来创建一个包含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;
}
答案 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;
}