「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バイトしか変更できないため、複雑なインデックス作成を行う必要がありますまたはそれを行う簡単な方法はありますか?
回答ありがとうございます