在C中生成随机整数,不在范围内

时间:2012-11-16 16:53:01

标签: c random

我想生成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;  
}  
}

这不是随意选择的。我可以拥有更高效的随机功能吗?

2 个答案:

答案 0 :(得分:5)

你需要有一个范围,否则你将用无限数字做什么?

没有参数 - rand()将返回0到RAND_MAX(通常为32765)之间的整数。

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

编辑:因为RAND_MAX是(在这种情况下)是一个15位数,要获得30位范围一起乘以两个rand(),再次得到一个32位范围 - 它可以环绕但不会改变随机性(显著)。

答案 1 :(得分: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是您想要获得的最大数字。