c - 生成随机无序的混合物

标签 c

我将编辑这个问题:我想完全按照第二张图片到达,是否有人对如何生成这种均匀随机分布有想法或引用。 我正在尝试使用 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);

有了上面的内容,我得到了下图。我如何编辑它,以便我拥有完全随机的点,而不是与另一个点重叠(就像无序的混合物) - 请参阅第二张图。

enter image description here enter image description here

最佳答案

两步:

  • 平均分配您的所有积分(在本例中为 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/

相关文章:

c++ - 使用 sizeof 而不是文字

c - strcat() 在尝试创建以空格分隔的字符串时删除字符串。 (C 编程)

CS50 Vigenere - 奇怪的图案

c++ - 文件读写的同时逐行读取文件

编译我的简单 C 代码

android - hrtimer 的触发时间比我设定的要早

c - 为什么 realloc 在此示例中不起作用?

检查 C 中 argc 的值

css - 在 gtk 刻度上更改 slider 大小

c - 使用指向外部结构元素的指针进行静态数组初始化?