C中的random(int)和randomize()

时间:2013-11-14 11:36:35

标签: c random

我想在给定范围内生成伪随机整数,而不会引入因使用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()只接受一个整数参数来确定给定数字的范围。我做错了什么?

编辑:似乎那些对应于一些TurboC旧事物。那么现在的问题是,如何制造出“真正”的随机整数,因为它们并没有偏斜?我的方法是(如Vatine所建议的)

#include <stdio.h>
#include <stdlib.h>

int main(){
  srand(time(NULL));
  printf("%d\n",rand()/(RAND_MAX/100));
  return 0;
}

似乎产生了正确的结果。这是否会增加一些偏差,或者结果至少具有落入该范围内任何数字的相等概率?

2 个答案:

答案 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的特定功能。

如何在C

中生成随机数

如果您想继续使用randsrand,可以执行以下操作:

int random(int N) {
    return (double)rand()/RAND_MAX * N;
}

但你也可以寻找其他随机发生器,如Mersenne Twister。有很多可用的实现。

答案 1 :(得分:1)

这是不正确的。 random的签名为long int random(void);

通常可以通过除以RAND_MAX/N而不是使用模数来获得更好的伪随机范围(PRNG的使用往往比低位更容易预测),但如果你担心的话这个,我建议使用一系列统计测试来看看你实际有多少偏见。