Я пишу кусок кода как часть моего проекта линейной алгебры. Предполагается использовать алгоритм Монте-Карло, известный как свойство случайного блуждания, для расчета распределений теплового равновесия для тела в статическом тепловом равновесии. Я студент машиностроения и никогда не учился на уроках информатики, поэтому все, что написано в коде, является результатом самообучения, поэтому, пожалуйста, извините, потому что я понимаю, что это Франкенштейн программы.
По сути, программа берет указанную точку на сетке и на основе случайного ввода перемещает ее влево, вправо, вверх, вниз, пока не достигнет граничной точки на этой сетке, а затем выбрасывает число, на которое она приземлилась, в вектор и повторяет пока количество значений в векторе не станет равным количеству предопределенных итераций. Программа не закончена, но проблема в том, что я хочу, чтобы программа «сбросила» обратно к начальной точке, как только она достигнет граничной точки. Похоже, это работает для случаев, когда число или итерации мало (1-5), но для всего, что выше, как считалось, программа пропускает этот шаг ... У меня есть программа, печатающая "координаты", где она находится в сетке, и мой предполагалось, что это никогда не будет число, которое не входит в сетку, но, похоже, это не относится к случаям, когда итерации велики.
#include <iostream>
#include <stdlib.h>
#include <array>
#include <algorithm>
#include <iterator>
#include <random>
using namespace std;
int main () {
int grid[5][5] = { //makes grid, this will be the model of the body that we want to find temperatues for
{2, 0, 0, 0, 0},
{2, 0, 0, 0, 0},
{2, 0, 0, 0, 0},
{2, 0, 0, 0, 0},
{1, 1, 1, 1, 1}
};
srand(time(NULL)); //seeds the random number generator
int x=2; // starting 'x' position
int y=3; // starting 'y' position
vector<int> values; // vector that will store values of boundry points once reached
int iterations = 7; // number of iterations
auto numberOfValues = values.size(); // how many numbers in the vector (how many times has the program reached the boundry points)
while(numberOfValues != iterations) {
int randomPath = rand()%4; // get four random numbers to define to move left, right, up, or down
switch (randomPath)
{
case 0:
x++;
cout <<"right"<<endl;
break;
case 1:
x--;
cout <<"left"<<endl;
break;
case 2:
y++;
cout <<"up"<<endl;
break;
case 3:
y--;
cout <<"down"<<endl;
break;
}
cout<<x<<","<<y<<endl;
//code below defines that when boundry coordinate is reached, put that value in the vector
if((x== 0 && y== 0)||(x== 0 && y== 1)||(x== 0 && y== 2 )||(x== 0 && y== 3)||(x== 0 && y== 4)||(y == 0 && x == 1)||(y == 0 && x == 2)||(y == 0 && x == 3)||(y == 0 && x == 4)){
values.push_back(grid[y][x]);
numberOfValues++; //increase the number of values in the vector by 1
x = 2; // reset x position
y = 3;//reset y position
}
cout <<numberOfValues<<endl;
}
return 0;
}
Tl; DR
Для большого числа переменных итераций программы, кажется, пропускают эту часть кода: (в частности, часть x = 2, y = 3)
if((x== 0 && y== 0)||(x== 0 && y== 1)||(x== 0 && y== 2 )||(x== 0 && y== 3)||(x== 0 && y== 4)||(y == 0 && x == 1)||(y == 0 && x == 2)||(y == 0 && x == 3)||(y == 0 && x == 4)){
values.push_back(grid[y][x]);
numberOfValues++; //increase the number of values in the vector by 1
x = 2; // reset x position
y = 3;//reset y position
}
Примечание. Код был написан с использованием кода Visual Studio в Ubuntu.
Примечание 2: Это моя первая публикация на этом сайте, если я сделал что-то неправильно с точки зрения формата, пожалуйста, сообщите мне, чтобы не повторять это.
Заранее благодарю за помощь