     // THREAD_NUM == MTGPDC_FLOOR_2P == 256
     // BLOCK_NUM_MAX == CURAND_NUM_MTGP32_PARAMS == 200
 
-    //m_seed = clotho::utility::clock_type::now().time_since_epoch().count();
-
-    m_seeds.reserve( STREAM_COUNT );
+    m_seed = clotho::utility::clock_type::now().time_since_epoch().count();
 
     assert( cudaMalloc( (void ** ) &dStates, STREAM_COUNT * BLOCK_NUM_MAX * sizeof( state_type ) ) == cudaSuccess );
     assert( cudaMalloc( (void ** ) &dParams, sizeof( state_param_type ) ) == cudaSuccess );
 
     assert( curandMakeMTGP32Constants( MTGPDC_PARAM_TABLE, dParams ) == CURAND_STATUS_SUCCESS );
 
-
-    for( unsigned int i = 0; i < STREAM_COUNT; ++i ) {
-        cudaStreamCreate( &streams[i] );
-
-        unsigned long long seed = clotho::utility::clock_type::now().time_since_epoch().count();
-
-        assert( curandMakeMTGP32KernelState( dStates + i * BLOCK_NUM_MAX, MTGPDC_PARAM_TABLE, dParams, BLOCK_NUM_MAX, seed) == CURAND_STATUS_SUCCESS );
-
-        m_seeds.push_back(seed);
-    }
+    assert( curandMakeMTGP32KernelState( dStates, MTGPDC_PARAM_TABLE, dParams, BLOCK_NUM_MAX, m_seed) == CURAND_STATUS_SUCCESS );
 }
 
 void crossover< 3 >::operator()(  real_type * rand_pool

protected:
    state_type * dStates;
    state_param_type * dParams;
    std::vector< unsigned long long > m_seeds;

    cudaStream_t streams[ STREAM_COUNT ];
};

/**

crossover< 3 >::~crossover() {
    cudaFree( dStates );
    cudaFree( dParams );
}

void crossover< 3 >::get_state( boost::property_tree::ptree & n ) {
    n.put( "crossover.version", 3 );
    n.put( "crossover.curand.state_type", clotho::cuda::curand_helper< typename crossover< 3 >::state_type >::StateName );
    
    n.add_child( "crossover.curand.seed", m_seed  );

#ifdef USE_TEXTURE_MEMORY_FOR_ALLELE
    n.put( "crossover.use_texture_memory_for_allele", true );
