Я хочу создать очень большой массив, на котором я пишу '0 и' 1. Я пытаюсь моделировать физический процесс, называемый случайной последовательной адсорбцией, где единицы длины 2, димеры осаждаются на n-мерную решетку в случайном месте, не перекрывая друг друга. Процесс останавливается, когда на решетке больше нет места для внесения большего количества димеров (решетка заклинивается).
Сначала я начинаю с решетки нулей, а димеры представлены парой "1". Поскольку каждый димер осаждается, участок слева от димера блокируется из-за того, что димеры не могут перекрываться. Поэтому я имитирую этот процесс, вкладывая тройку "1 на решетку". Мне нужно многократно повторять всю симуляцию, а затем выработать среднее покрытие%.
Я уже сделал это, используя массив символов для 1D и 2D решеток. На данный момент я пытаюсь сделать код максимально эффективным, прежде чем работать над проблемой 3D и более сложными обобщениями.
Это в основном то, что выглядит код в 1D, упрощенный:
int main()
{
/* Define lattice */
array = (char*)malloc(N * sizeof(char));
total_c = 0;
/* Carry out RSA multiple times */
for (i = 0; i < 1000; i++)
rand_seq_ads();
/* Calculate average coverage efficiency at jamming */
printf("coverage efficiency = %lf", total_c/1000);
return 0;
}
void rand_seq_ads()
{
/* Initialise array, initial conditions */
memset(a, 0, N * sizeof(char));
available_sites = N;
count = 0;
/* While the lattice still has enough room... */
while(available_sites != 0)
{
/* Generate random site location */
x = rand();
/* Deposit dimer (if site is available) */
if(array[x] == 0)
{
array[x] = 1;
array[x+1] = 1;
count += 1;
available_sites += -2;
}
/* Mark site left of dimer as unavailable (if its empty) */
if(array[x-1] == 0)
{
array[x-1] = 1;
available_sites += -1;
}
}
/* Calculate coverage %, and add to total */
c = count/N
total_c += c;
}
Для реального проекта, который я делаю, речь идет не только о димерах, а о тримерах, квадримерах и разных формах и размерах (для 2D и 3D).
Я надеялся, что смогу работать с отдельными битами вместо байтов, но я читал, и, насколько я могу судить, вы можете изменять только 1 байт за раз, так что либо мне нужно сделать некоторая сложная индексация или есть более простой способ сделать это?
Спасибо за ваши ответы