docs: public static DMatrixSparseCSC symmetric( int N , int nz_total ,
                                                double min , double max , Random rand) {
  
          // compute the number of elements in the triangle, including diagonal
          int Ntriagle = (N*N+N)/2;
          // create a list of open elements
          int open[] = new int[Ntriagle];
          for (int row = 0, index = 0; row < N; row++) {
              for (int col = row; col < N; col++, index++) {
                  open[index] = row*N+col;
              }
          }
  
          // perform a random draw
          UtilEjml.shuffle(open,open.length,0,nz_total,rand);
          Arrays.sort(open,0,nz_total);
  
          // construct the matrix
          DMatrixSparseTriplet A = new DMatrixSparseTriplet(N,N,nz_total*2);
          for (int i = 0; i < nz_total; i++) {
              int index = open[i];
              int row = index/N;
              int col = index%N;
  
              double value = rand.nextDouble()*(max-min)+min;
  
              if( row == col ) {
                  A.addItem(row,col,value);
              } else {
                  A.addItem(row,col,value);
                  A.addItem(col,row,value);
              }
          }
  
          DMatrixSparseCSC B = new DMatrixSparseCSC(N,N,A.nz_length);
          ConvertDMatrixStruct.convert(A,B);
  
          return B;
      }