2016-02-15 43 views
0

我对C++很新颖,但是,我尝试创建一些盐和胡椒的噪音。 它几乎完成了,只是在我想要洗牌一系列整数,不管我做什么,无论我使用什么样的随机函数,我总是得到那个讨厌的“从这里需要”,它不告诉我任何东西。 这里是我的代码:C++ - shuffle:从这里需要

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 
#include <stdio.h> 
#include <random> 
#include <algorithm> 
#include <iterator> 



using namespace std; 
using namespace cv; 



int main(int argc, char** argv) 
{ 
cv::Mat m(256, 256, CV_8UC1, cv::Scalar(255)); 

     // Print it 
     // int counter = 0; 



     unsigned int range = 255 - 0 + 1; 
     int num = rand() % range ; 



     int x[256]; 
     for (int i = 0; i<256; i++){ 
      x[i]= i; 

     } 


     srand(17); 
     auto engine = std::default_random_engine{}; 
     shuffle(x[0], x[255], engine); 
     int coord[256][256]; 
     for (int t= 0; t<256; t++){ 
      coord[t][t] = x[t]; 
     } 

     for (int j = 0; j<256; j++){ 
      for (int k = 0; 0<256; k++) 
      {if (coord[j][k]<=num){ 
       cv::Mat black(m, cv::Rect(j, k, 1, 1)); 
       black = cv::Scalar(0, 0, 0); 
      } 

      } 
     } 

// Create a named window 
      cv::namedWindow("Test", cv::WINDOW_AUTOSIZE); 

      // Display 
      imshow("Test", m); 

      // Wait until a key is pressed 
      cv::waitKey(0); 

       return 0; 
     }; 

我得到这个错误似乎是由这一行造成的:

shuffle(x[0], x[255], engine); 

现在,我很高兴地给予完整的编译器的文本,但有些线路是这样长期以来,不可能做必要的缩进,我试过了。 有没有人有解决方法?

+1

对于未来,请提供[MCVE],其中在*最小强调*。这个问题与opencv和那些循环完全无关。 –

+1

另外'srand'不会给你的'std :: default_random_engine'播种,这是你期待的。阅读[doc](http://en.cppreference.com/w/cpp/numeric/random)。 –

回答

1

你必须传递迭代器,而不是值。

应该

shuffle(std::begin(x), std::end(x), engine); 

shuffle(x, x + 256, engine);