我想生成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;
}
}
这不是随意选择的。我可以拥有更高效的随机功能吗?
答案 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
是您想要获得的最大数字。