2

我想生成 100 个具有随机 x 和 y 坐标的节点。但我不想指定任何范围。像 rand(100) 只会生成 1 到 100 之间的数字。但我希望这些数字分布在一个大区域内,并且我希望它们是随机的。我如何使用 C 来实现它?我努力了:

 int gen_rand_position(void)  
{  
     int i,j,a[100],b[100];  
    for(i=0,j=0;i<100,j<100;i++,j++)  
{
    x=rand();  
        y=rand();  
    a[i]=x;  
    b[j]=y;  
}  
}

这不是随机选择的。我可以有更有效的随机函数吗?

4

2 回答 2

5

您需要有一个范围,否则您将如何处理无限数?

没有参数 - rand() 将返回一个介于 0 和 RAND_MAX 之间的整数(通常为 32765)。

如果您需要一个大于此的数字,您可以组合两个 rand() 数字。关于组合随机数的最佳方法存在复杂的统计论据,因此您不会更改随机性,但我认为您无需担心这一点。

编辑:由于 RAND_MAX 是(在这种情况下)一个 15 位数字,要获得 30 位范围将两个 rand() 相乘,再获得 32 位范围相乘 - 它可能会环绕,但不会改变随机性(显着)。

于 2012-11-16T16:55:14.093 回答
1

要获得分布在整个int范围内的随机数,请将来自多次调用的随机位组合到rand()

#include <stdlib.h>

int large_rand()
{
  const int RAND_BITS = 15;  /* covers stdc minimum for RAND_MAX */
  const int INT_BITS = 8 * sizeof(int);
  const int ITERS = (INT_BITS + RAND_BITS - 1) / RAND_BITS;
  int i, result = 0;
  for (i = 0; i < ITERS; i++) {
    result <<= RAND_BITS;
    result |= rand() & ~(~0U << RAND_BITS);
  }
  return result;
}

要获得所需范围内的随机数,请使用large_rand() % (MAX + 1),其中MAX是您想要获得的最大数。

于 2012-11-16T17:11:26.217 回答