public void sampling () {
        int z = 0;
        int N = 0;
        int wordId = 0;
        float probZ [] = new float [K];
        double probZ_ = 0.0;
        double probSum = 0.0; 
        Random random = new Random ();
       
        //Iter 
        for (int it=0;it<iter;++it) {
            System.out.println ("Iterate:" + it);
            //All Doc
            for (int m=0;m<M;++m) {
                //A Doc
                N = data [m].length;
                for (int n=0;n<N;++n) {
                    z = zAssign [m][n];
                    wordId = data [m][n];
                    
                    // -1
                    NWZ [wordId][z] -= 1;
                    NMZ [m][z] -= 1;
                    NZ [z] -= 1;

                    // Cal prob
                    for (int k=0;k<K;++k) {
                        probZ [k] = (NWZ [wordId][k] + beta) / (NZ [k] + V*beta) * (NMZ [m][k] + alpha);
                    }                    
                    
                    for (int k=1;k<K;++k) {
                        probZ [k] += probZ [k-1];
                    }
                    
                    probSum = probZ [K-1]; 
                    probZ_ = random.nextDouble () * probSum; // (0~1.0)*probSum
                    
                    int k = 0; 
                    for (k=0;k<K-1;++k) {
                        if (probZ [k] > probZ_) {
                            break;
                        }
                    }
                    
                    z = k; 
                    zAssign [m][n] = z;
                    
                    // +1
                    NWZ [wordId][z] += 1;
                    NMZ [m][z] += 1;
                    NZ [z] += 1;
                } //A Doc
            } //All Doc
        } //Iter
    } // Sampling