我正在学习C ++,并且遇到了一个关于如何从0到100的值随机生成的整数数组中删除重复的想法。我这样编码,但我看到有些数字正在重复。我真的无法弄清楚这个bug。请帮忙。
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int item[100];
int z;
int count = 0;
for (z = 0; z < 100; z++) {
item[z] = rand() % (z + 1);
count++;
cout << item[z] << endl;
}
cout << "Total = ";
cout << count << endl;
int i, j;
int NewLength = 1;
for (i = 1; i < 100; i++) {
for (j = 0; j < NewLength; j++) {
if (item[i] == item[j])
break;
}
if (j == NewLength)
item[NewLength++] = item[i];
}
for (int x = 0; x < 100; x++) {
cout << item[x] << endl;
}
}
答案 0 :(得分:0)
从一个包含100个整数的数组开始。假设某些整数是重复的,则小于 100个唯一整数。因此,由于数组中的唯一整数少于100个,除非您的算法生成原始序列中尚未存在的新整数值,否则您可以确定如果打印出阵列的所有100个值,您将看到重复值,如你最后或你的程序。
如果您只打印NewLength
,则不应该看到任何重复项(假设您的算法正确,我没有严格检查)。
for (int x = 0; x < NewLength; x++) {
cout << item[x] << endl;
}
答案 1 :(得分:0)
如果您可以使用C ++ 11并且不介意这样做,那么您可以做的是存储0到100的数字 一个数组。
接下来,你可以随机shuffle
他们瞧..从0到100的随机顺序的唯一数字数组。否则,如果你不能,请忽略这个解决方案。
#include <random>
#include <numeric>
#include <algorithm>
#include <iostream>
int main()
{
int arr[100] = {0};
std::iota(&arr[0], &arr[100], 0);
std::random_device rd;
std::mt19937 mt(rd());
std::shuffle(&arr[0], &arr[100], mt);
for (int i = 0; i < 100; ++i)
std::cout<<arr[i]<<" ";
}
另一种选择是生成一个0到100的数组并随机交换索引(假设你不能使用C ++ 11和random_shuffle
)。
答案 2 :(得分:0)
#include <ctime>
int main()
{
srand(time(NULL));
int item[100];
int z;
int count = 0;
for (z = 0; z < 100; z++) {
item[z] = rand() % (z + 1);
count++;
cout << item[z] << endl;
}
cout << "Total = ";
cout << count << endl;
//Assume if duplicate found assign -1 in the place of duplicate
for(int i = 0;i<100;++i)
{
if(item[i] == -1) //If this number already checked & it is a duplicate
continue;
for(int j=i+1;j<99;++j)
{
if(item[i] == item[j])
{
//Duplicate found.
item[j] = -1; //Assign -1 in the place of duplicate
}
}
}
for (z = 0; z < 100; z++) {
if(item[z] != -1)
cout << item[z] << endl;
}
char c;
cin >> c;
return 0;
}
答案 3 :(得分:0)
这是另一个“从随机生成的整数数组中删除副本”。
如果遇到重复的随机数,下面这行代码会反转一次迭代。
for(int j=0;j<i;j++) if (random_once[j]==random_once[i]) i--;
整个代码:
#include <ctime>
#include <iostream>
using namespace std;
int main()
{
int size=100 ;
int random_once[100 ];
srand(time(0));
for (int i=0;i<size;i++)
{
random_once[i]=rand() % 100;
// generate unique random number only once
for(int j=0;j<i;j++) if (random_once[j]==random_once[i]) i--;
}
cout<<" "<< i <<"\n\n\n ";
for ( i=0;i<size;i++) cout<<" "<<random_once[i]<<"\t";
return 0;
}
输出:
60 61 96 77 89 94 31 87 19 24
27 99 64 7 8 88 62 75 37 97
28 55 92 48 91 47 50 13 36 85
21 34 82 23 40 4 79 90 46 10
18 0 2 74 56 33 70 84 49 73
69 57 32 41 83 67 76 43 35 44
80 14 25 93 11 15 63 9 26 16
5 98 17 38 51 30 53 58 3 65
66 52 95 86 78 29 42 12 45 59
81 71 39 6 1 68 20 72 54 22
Press any key to continue