Вы не можете объявить статический массив, используя не-const integer для своих измерений.
Вы объявляете массив указателей, но указатели не указывают на какую-либо действительную память, поэтому вы получаете ошибки памяти.
Попробуйте вместо этого:
const int N = 100;
double A[N][N];
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[i][j] = distribution(generator);
}
}
С другой стороны, выделить массив в куче, вместо стека (то вы можете использовать неконстантную Int для измерений):
int N = 100;
double **A = new double*[N];
for(int i = 0; i < N; ++i) {
A[i] = new double[N];
}
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[i][j] = distribution(generator);
}
}
...
for(int i = 0; i < N; ++i) {
delete[] A[i];
}
delete[] A;
Или это :
int N = 100;
double *A = new double[N*N];
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[(i*N)+j] = distribution(generator);
}
}
...
delete[] A;
с учетом сказанного, то лучше использовать std::vector
вместо new[]
вручную:
int N = 100;
std::vector<std::vector<double> > A(N);
for(int i = 0; i< N; i++) {
A[i].resize(N);
}
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[i][j] = distribution(generator);
}
}
Или:
int N = 100;
std::vector<double> A(N*N);
random_device rd;
default_random_engine generator;
generator.seed(rd());
normal_distribution<double> distribution(0.0,1.0);
for(int i = 0; i < N; ++i) {
for(int j = 0; j < N; ++j) {
A[(i*N)+j] = distribution(generator);
}
}
Обратите внимание, что ваша вторая строка объявляет двумерный массив указателей ** ** ** на двойные указатели **. вы можете изменять значения только на 'A [i] [j]'. Если вы хотите присвоить значение '** A [i] [j]', вы должны сначала выделить для него память, используя 'new'. – Xiobiq
Предупреждение: вы не хотите, чтобы каждый раз, когда вы его используете, каждый раз переставляете генератор случайных чисел. Очень дорого и может привести к тому, что всегда будет получать одинаковое число, в зависимости от реализации 'std :: random_device'. Устанавливайте генератор только один раз в начале программы. – user4581301