Моделирование случайного блуждания в одном измерении с использованием генератора случайных чисел - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь разработать симуляцию случайного блуждания в одном измерении. Я моделирую частицу вдоль линии с 10 дискретными позициями, которые может занимать частица. Частица может двигаться только влево или вправо на один пробел каждый раз, когда она «прыгает». В этой симуляции я получаю код для учета 20 прыжков. Генератор случайных чисел выдает 0 - для левого и 1 - для правого перед каждым «прыжком», чтобы сообщить «частице» go влево или вправо. Пожалуйста, смотрите код ниже и дальнейшие комментарии.

#include <stdio.h> 
#include <stdlib.h>
#include <time.h>

int randomInt( int max); // declaration of function //

int main() 
{ // declaration of variables //
  int i, j = 0;
  int totalHops=20; 
  int seed;
  int sites[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
  int *location;
  location = &sites[j];

  seed = time(NULL); 

  printf("The seed value for this 'random walk' is: %d.\n\n", seed); //keeping track of the seed used// 

  // setup the random number generator // 
  srandom(seed);  // random path sequence //
  printf("Initial location of the particle is at site %d.\n\n", *location);
  for ( i=1; i<totalHops+1; i++ ) 
  {

    int direction = randomInt(2); // Two possible directions for particle to move, 0 = left, 1 = right // 

    if (direction == 1) {
        location+= 1; // pointer moves right one space on array //
    }
    else {
        location-= 1; // pointer moves left one space on array // 
    }

    printf("After %2.d hop(s), the particle is at site %d.\n", i, (*location)%10);  // I  would prefer to be printing the entry of my array rather than relying on the fact the array is lablled with each entry the positon I have changed the pointer to //
  }
  printf("\n");
}

// function definition //
int randomInt(int max)
{
    return (random() % max);
}

Мой вывод не повторяется каждый раз, когда я ожидаю паттерны. Похоже, выводит, что частица находится в положении 0 в одной итерации, а в следующую внезапно окажется в положении 4, например. Я бы предпочел, чтобы я печатал запись массива sites [], а не вводил положение в каждую запись и печатал значение указателя.

Буду очень признателен за любую помощь здесь. Я новичок в указателях, поэтому любая помощь будет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Рассмотрим следующую часть:

if (direction == 1) {
        location+= 1; // pointer moves right one space on array //
    }
else {
    location-= 1; // pointer moves left one space on array // 
}

Теперь рассмотрим, когда для l oop выполняется первая итерация. Что если направление равно 0? location станет &sites[0] - 1, конечно же, из массива. Итак, вы должны поставить условия для проверки границ для массива sites.

0 голосов
/ 14 апреля 2020

Это исправляет проблему, которая у меня была. Я решил автоматизировать массив, который указывает положение частицы, заполняя элементы целым числом, соответствующим положению через a для l oop. Если есть какие-либо рекомендации о том, как сделать эту программу более эффективной или удобной для чтения, не стесняйтесь комментировать.

#include <stdio.h> 
#include <stdlib.h>
#include <time.h>
int randomInt( int max);
int main() 
{ 
  int i, j = 0;
  const int L = 10;
  const int totalHops=20; 
  int sites[L] = {};
  for (int k=0; k<L; k++) 
  {sites[k]=k+1;} 
  int *location;
  location = &sites[j];
  srandom(time(NULL));  
  printf("\nThe seed value for this 'random walk' is: %ld.\n\n", time(NULL)); 
  printf("Initial location of the particle is at site %d.\n\n", *location);
    tracker[0] = sites[0];
  for ( i=1; i<=totalHops; i++ ) 
  { 
    int direction = randomInt(2); 
    // Two possible directions for particle to move, 0 = left, 1 = right // 
    if (direction == 1) {
        location+= 1; // pointer moves right one space on array //
        if (location == &sites[L-1]+1) // takes particle from site 10 to 1 //
        {
            location = &sites[0];
        }
    }   else if (direction == 0) {
        location-= 1; // pointer moves left one space on array //
        if (location == &sites[0] - 1) // takes particle from site 1 to 10 //
        {
            location = &sites[L-1]; 
        }  
    }
    printf("After %2.d hop(s), the particle is at site %d.\n", i, (*location));
  } printf("\n");
}
// function definition //
int randomInt(int max)
{
    return (random() % max);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...