我将编辑这个问题:我想完全按照第二张图片到达,是否有人对如何生成这种均匀随机分布有想法或引用。 我正在尝试使用 C 语言生成随机点 A 和 B (NA=514 NB=513) 作为矩形中点的混合
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);
有了上面的内容,我得到了下图。我如何编辑它,以便我拥有完全随机的点,而不是与另一个点重叠(就像无序的混合物) - 请参阅第二张图。
最佳答案
两步:
- 平均分配您的所有积分(在本例中为 1027)
- 随机选择其中 513 个,将其归入一类,另一类归入另一类
作为额外的注意,自滚动的“快速”随机数生成器通常不是很好。请注意数值食谱中的建议:
“如果所有因[随机数生成器]不良而导致结果受到质疑的科学论文从图书馆书架上消失,那么每个书架上都会有一个拳头那么大的间隙。”
这里是一些代码,未经测试,不保证工作。
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.
}
//复制的第二部分留给读者作为练习。
关于c - 生成随机无序的混合物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28771381/