我想在给定范围内生成伪随机整数,而不会引入因使用rand()%N
而产生的偏差。
我已阅读过似乎替换random()
和randomize()
函数的函数rand()
和srand()
,但直接返回作为参数给出的范围内的整数random()
函数。在这两种情况下,函数似乎都在stdlib.h
库中。
我遇到的问题是我不能以某种方式使这些功能起作用。这是我用来测试函数的一个小测试代码。
#include <stdio.h>
#include <stdlib.h>
int main(){
randomize();
printf("%d\n",random(100));
return 0;
}
编译gcc -o test test.c
时会出错
test.c: In function ‘main’:
test.c:6: error: too many arguments to function ‘random’
据我所知,函数random()
只接受一个整数参数来确定给定数字的范围。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
int main(){
srand(time(NULL));
printf("%d\n",rand()/(RAND_MAX/100));
return 0;
}
似乎产生了正确的结果。这是否会增加一些偏差,或者结果至少具有落入该范围内任何数字的相等概率?
答案 0 :(得分:2)
man random
告诉我:
#include <stdlib.h>
long int random(void);
所以错误信息是正确的:“随机”功能的参数太多了。
我不知道函数randomize
和我所知道的random
函数没有任何参数。
但我确实在互联网上找到了这个(小心,你不应该使用这个代码,我只是说):
#ifndef __TURBOC__
#define randomize() srand48(getpid())
#define random(x) (lrand48() % x)
#endif
所以也许这是一个涡轮增压C老东西?我还发现this example往往证实它是Turbo C的特定功能。
如果您想继续使用rand
和srand
,可以执行以下操作:
int random(int N) {
return (double)rand()/RAND_MAX * N;
}
但你也可以寻找其他随机发生器,如Mersenne Twister。有很多可用的实现。
答案 1 :(得分:1)
这是不正确的。 random
的签名为long int random(void);
。
通常可以通过除以RAND_MAX/N
而不是使用模数来获得更好的伪随机范围(PRNG的使用往往比低位更容易预测),但如果你担心的话这个,我建议使用一系列统计测试来看看你实际有多少偏见。