У меня есть эта проблема:
Создать программу, которая строит решетку из одного (1) измерения и
100000 сайтов. В этой решетке на случайных позициях ставят ряд ловушек
молекулы, которые будут иметь концентрацию в. Поместите 1 частицу в случайном порядке
положите на решетку и дайте ему выполнить случайную прогулку. В этой прогулке
Вы не будете устанавливать ограничение по времени, а именно не будете объявлять
конкретное количество шагов. Прогулка остановится, когда частица упадет
в ловушке .............................. ... Остерегайтесь границ
условия. Когда частица достигает границ решетки, она
не должно быть позволено сбежать из него, но оставаться в решетке,
либо вернувшись на прежнюю позицию или будучи помещенным в
противоположный участок решетки ........
Мой подход показан в коде, который я создал (у меня есть комментарии).
def steps1d(self,pos,c):
#pos: number of positions
#c: concentration of trap-particles
# array full of traps (zeros)
myzeros = sc.zeros(self.c*self.pos)
# grid full of available positions(ones)
grid = sc.ones(self.pos)
# distribute c*pos zeros(traps) in random positions (number of positions is pos)
traps = sc.random.permutation(pos)[:c*pos]
# the grid in which the particle is moving which has traps inside it
grid[traps] = myzeros
steps_count = [] # list which holds the number of steps
free = 0
for i in range(pos):
# the step of the particle can be 0 or 1
step=sc.random.random_integers(0,1)
for step in grid[:]:
if step == 1:
free += 1
steps_count.append(free)
else:
break
return steps_count
У меня 3 проблемы:
1) Результаты, которые я беру, например, для pos = 10, выглядят как:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 ...]
Я бы ожидал, что 10 чисел за 1 прогон (переменная pos).
2) Я не уверен, как справиться с граничными условиями. Я думаю что-то вроде:
if free > grid.size:
free = free - 1
Но я не могу это проверить. Кроме того, я не уверен, применимо ли это к обеим границам сетки.
3) Если я хочу, чтобы первый шаг начинался с середины сетки, как я могу это сделать?
Если у кого-то есть подсказка, я буду благодарен.