Я пишу функцию, которая принимает входные данные n и создает одномерный массив размером (2n-1) ^ 2 для имитации квадрата.Т.е. для входа n = 1 есть только одна точка, для входа n = 2 это будет выглядеть как
0 1 2
3 4 5
6 7 8
, а для n = 3 это будет выглядеть как
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
где каждое число является точкой.
Функция завершается, когда текущее местоположение определяется как находящееся на краю, и точка пытается сдвинуться с сетки квадрата.
Цель этого состоит в том, чтобы смоделировать, сколько точек посещается для квадратов разных размеров, от n = 2 ^ 0 до n = 2 ^ 8, и возвращать долю того, сколько точек посещено в общем количестве точек в квадрате..
Функция генерирует случайное число и проверяет его модуль на 4, и если она возвращает 0, местоположение перемещается вверх на 1, если оно возвращает 1, местоположение перемещается вправо, 2 понижается,и 3 уходит влево.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double two_d_random (int n) {
int tot_points = (2 * n - 1)*(2 * n - 1);
int value = (n*n)+((n-1)*(n-1))-1; //center
int length = 2 * n - 1; //length of side
int *array = (int *)malloc (sizeof (int) * tot_points);
int count = 0;
array[value] = 1;
while (1 == 1) {
int r = rand () % 4;
array[value] = 1;
if (r == 0) {//UP
if ((value >= 0) && (value < length)) {
goto a;
}
else {
array[value] = 1;
value -= length;
}
}
else if (r == 1) {//RIGHT
if ((value % length) == (2*n-2)){
goto a;
}
else {
array[value] = 1;
value += 1;
}
}
else if (r == 2) {//DOWN
if ((value < tot_points) && (value >= (tot_points - length))) {
goto a;
}
else {
array[value] = 1;
value += length;
}
}
else if (r == 3) {//LEFT
if (value % length == 0) {
goto a;
}
else {
array[value] = 1;
value -= 1;
}
}
}
a:
for (int i = 0; i < tot_points; i++) {
if (array[i] == 1) {
count += 1;
}
}
free (array);
return 1.0 * count / tot_points;
}
int main ()
{
int trials = 1000;
srand (12345);
for (int n = 1; n <= 256; n *= 2)
{
double sum = 0.;
for (int i = 0; i < trials; i++)
{
double p = two_d_random(n);
sum += p;
}
printf ("%d %.3lf\n", n, sum / trials);
}
return 0;
}
Моя текущая проблема заключается в том, что, пока я запускаю его на своем компьютере, я получаю диапазон значений, которых я не ожидаю:
Однако, когда коллега запускает его на своей машине, тэй, получите следующее, что я и ожидал:
Я понимаю, что это большая сумма, чтобы спросить в один момент.Я также понимаю, что я не должен использовать goto.Однако я потратил на это много времени и не знаю, как это исправить.Любая помощь с благодарностью.