我想创建一个非常大的数组,在上面写 '0' 和 '1'。我正在尝试模拟一种称为随机顺序吸附的物理过程,其中长度为 2 的单位(二聚体)被沉积在随机位置的 n 维晶格上,而不会相互重叠。当晶格上没有更多空间用于沉积更多二聚体(晶格被堵塞)时,该过程停止。
最初,我从零格开始,二聚体由一对“1”表示。随着每个二聚体的沉积,二聚体左侧的位点被阻塞,因为二聚体不能重叠。所以我通过在格子上放置三个'1'来模拟这个过程。我需要多次重复整个模拟,然后计算出平均覆盖率。
我已经使用 1D 和 2D 晶格的字符数组完成了这项工作。目前,在处理 3D 问题和更复杂的概括之前,我正在尝试使代码尽可能高效。
这基本上是代码在一维中的样子,简化:
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 个字节,所以要么我需要做一些复杂的索引或者有更简单的方法吗?
感谢您的回答