【问题标题】:how to check for duplicates in random array?如何检查随机数组中的重复项?
【发布时间】:2015-03-21 18:25:01
【问题描述】:

我有一个包含 4 个数字的数组,但在检查重复项时遇到了问题。我的印象是,如果我为 arr[i] 随机化数字,那么对于 arr[j],我可以比较它们是否重复,如果为真,则再次随机化。如何检查数组的元素是否重复/重复?

int arr[4];
srand(time(0));

for(int i=0; i<4; i++)
{
    arr[i] = rand() % 10;
    for(int j=i+1; j<4; j++)
    {
        arr[j] = rand() % 10;
        if(arr[j] == arr[i])
        {
            arr[i] = rand() % 10;
        }
    }
}

for(int i=0; i<4; i++)
cout << arr[i] << endl;  

【问题讨论】:

  • 标签中有“排序”,但代码中没有。也不清楚[重新]随机化数组的目的是什么。无论如何,我相信您正在寻找的术语/方法是“随机洗牌” - 这就是强力球彩票或洗牌的工作原理。 (寻找这些会导致相关的问题/答案。)

标签: c++ arrays random


【解决方案1】:

避免同时使用goto 的另一个技巧是在检查重复项时反转i for(int j=0; j &lt; i ; j++) if (arr[j] == arr[i]) i--

#include <iostream>
#include <ctime>
using namespace std;



int main(void)
{
      const int size=100 ;
      int  arr[100] ;
      int i=0;

      srand(time(0));

      for ( i=0;i<size;i++)   {
          arr[i]=rand() % size;
          for(int j=0; j < i ; j++)  if (arr[j] == arr[i]) i--; 
      }
       cout<<"   \n\n\n ";


      // Loop to display the array arr[ ]
      for (  i=0;i<size;i++) cout<<""<<arr[i]<<"\t";

      cout<<" \nPress any key to continue\n";
      cin.ignore();
      cin.get();

  return 0;
}

输出:

 91     71      14      65      12      25      64      98      83      28
99      9       5       0       89      36      95      55      73      90
78      2       52      70      39      63      17      50      7       58
34      84      40      51      20      31      38      32      35      49
61      66      72      92      6       59      41      13      22      23
81      56      1       16      21      62      57      10      11      54
77      86      76      93      4       96      8       33      94      67
29      48      15      82      97      37      26      46      43      80
68      85      60      30      42      53      18      69      45      88
47      79      75      44      24      27      74      3       19      87

Press any key to continue

【讨论】:

    【解决方案2】:

    它不起作用,因为您正在检查当前索引 i 上方的数组内容,它甚至还没有被写入,您需要检查索引 i 下方的内容以找到您尚未存储的新值.

    您的代码的第二个问题是,如果它已经存在,它只能生成一次新的随机数。程序从不检查第二个替代随机数是否也已经存在。

    这应该是正确的:

    for (int i=0; i<4; i++)
    {
        boolean exists = true;
        while (exists) {
            exists = false;
            arr[i] = rand() % 10;
    
            for (int j=0; j<i && !exists; j++)
                if (arr[j] == arr[i])
                    exists = true;
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是一个演示程序

      #include <iostream>
      #include <cstdlib>
      #include <ctime>
      
      int main() 
      {
          const size_t N = 4;
          int arr[N];
      
          std::srand( std::time( nullptr ) );
      
          for ( size_t i = 0; i < N; i++ )
          {
              size_t j;
              do
              {
                  arr[i] = std::rand() % 10;
      
                  j = 0;
                  while ( j < i && arr[j] != arr[i] ) j++;
              } while ( j != i );
          }
      
          for ( int x : arr ) std::cout << x << ' ';
          std::cout << std::endl;
      }
      

      程序输出可能看起来像

      5 9 6 7
      

      【讨论】:

        【解决方案4】:

        您可以使用这种方法。当 j=i+1 直到 j

        for (int i = 0; i<4; i++)
            {
                arr[i] = rand() % 10;
                if (i == 0)
                {
                    continue;
                }
        
                for(j=0,j<i-1;j++)
              {
                if (arr[j] == arr[i])
                {
                    arr[i] = rand() % 10;
                }
        
              }
            }
        

        【讨论】:

          猜你喜欢
          • 2016-10-12
          • 2017-09-15
          • 2016-04-13
          • 2016-05-13
          • 2019-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多