我将编辑此问题:我想完全按照第二张图片的方式到达,是否有人对如何生成均匀随机分布有任何想法或参考。 我试图使用这个随机生成A点和B点(NA = 514 NB = 513)作为C语言矩形点的混合
for(i=0;i <=par.Na-1;i++) {
do {
coo[i][0] = w * ran1_fast() ; //ran1_fast a random number from 0 to 1
coo[i][1] = Le * ran1_fast() ;
} while(mindist2(i) < sd2) ;
//similarly for B
for (j = par.Na+1; j <=(par.Nb+par.Na)-1; j++) {
do {
coo[j][0] = w * ran1_fast() ;
coo[j][2] = Le * ran1_fast() ;
} while(mindist2(j) < sd2);
有了上述内容,我得到的是下图。我怎么能编辑这个以便我有完全随机的点而不是在另一个上重叠(如混乱的混合) - 见第二个数字。
答案 0 :(得分:0)
两个步骤:
作为额外的警示,自动快速&#39;随机数发生器往往不是很好。请注意数字食谱中的建议:
&#34;如果由于不良[随机数发生器]导致结果有疑问的所有科学论文都要从图书馆的书架上消失,那么每个书架上的间隙就会与你的拳头一样大。&#34;
以下是一些未经测试且无法保证正常工作的代码。
int temp[2*par.Na-1][2];
for(i=0;i <=2*par.Na-1;i++) {
do {
temp[i][0] = w * ran1_fast();
temp[i][1] = Le * ran1_fast();
} while(mindist2(i) < sd2) // I left this, but it could be an (almost) endless loop.
for (i=par.N1-1; i>=0; i--)
{
int npick;
npick = ran1_fast() * i; // Pick an element randomly. Can your random number generator return 1? Then fix this.
coo[i][0] = temp[npick][0];
coo[i][2] = temp[npick][1];
temp[npick] = temp[i]; // Copy down the last element.
}
//复制的第二部分留给读者作为例外。