Skip to content

Commit

Permalink
fix use of Mersenne Twister in normal raster alg
Browse files Browse the repository at this point in the history
  • Loading branch information
root676 authored and nyalldawson committed Apr 20, 2020
1 parent f3aa8af commit e6c7728
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 8 deletions.
11 changes: 7 additions & 4 deletions src/analysis/processing/qgsalgorithmnormalraster.cpp
Expand Up @@ -113,13 +113,16 @@ bool QgsNormalRasterAlgorithm::prepareAlgorithm( const QVariantMap &parameters,
mMean = parameterAsDouble( parameters, QStringLiteral( "MEAN" ), context );
mStdev = parameterAsDouble( parameters, QStringLiteral( "STDEV" ), context );

mNormalDoubleDistribution = std::normal_distribution<double>( mMean, mStdev );

return true;
}

QVariantMap QgsNormalRasterAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
{
std::random_device rd {};
std::mt19937 mersenneTwister{rd()};

std::normal_distribution<double> normalDoubleDistribution = std::normal_distribution<double>( mMean, mStdev );

const QString outputFile = parameterAsOutputLayer( parameters, QStringLiteral( "OUTPUT" ), context );
QFileInfo fi( outputFile );
const QString outputFormat = QgsRasterFileWriter::driverForExtension( fi.suffix() );
Expand Down Expand Up @@ -157,7 +160,7 @@ QVariantMap QgsNormalRasterAlgorithm::processAlgorithm( const QVariantMap &param
std::vector<float> float32Row( cols );
for ( int col = 0; col < cols; col++ )
{
float32Row[col] = static_cast<float>( mNormalDoubleDistribution( mRandomDevice ) );
float32Row[col] = static_cast<float>( normalDoubleDistribution( mersenneTwister ) );
}
block.setData( QByteArray( reinterpret_cast<const char *>( float32Row.data() ), QgsRasterBlock::typeSize( Qgis::Float32 ) * cols ) );
break;
Expand All @@ -167,7 +170,7 @@ QVariantMap QgsNormalRasterAlgorithm::processAlgorithm( const QVariantMap &param
std::vector<double> float64Row( cols );
for ( int col = 0; col < cols; col++ )
{
float64Row[col] = mNormalDoubleDistribution( mRandomDevice );
float64Row[col] = normalDoubleDistribution( mersenneTwister );
}
block.setData( QByteArray( reinterpret_cast<const char *>( float64Row.data() ), QgsRasterBlock::typeSize( Qgis::Float64 ) * cols ) );
break;
Expand Down
4 changes: 0 additions & 4 deletions src/analysis/processing/qgsalgorithmnormalraster.h
Expand Up @@ -56,13 +56,9 @@ class QgsNormalRasterAlgorithm : public QgsProcessingAlgorithm
double mPixelSize;
Qgis::DataType mRasterDataType;
int mTypeId;
std::random_device mRandomDevice;
std::mt19937 mMersenneTwister;

double mMean;
double mStdev;

std::normal_distribution<double> mNormalDoubleDistribution;
};

///@endcond PRIVATE
Expand Down

0 comments on commit e6c7728

Please sign in to comment.