C中rand()函数行为的差异

时间:2017-12-17 05:12:21

标签: c random

我正在尝试使用乘法移位算法进行散列,并且每次都需要生成一个新的随机数。我使用了一个函数来做同样的事情 -

long mulShift(long x)
// returns h(x) for multiply shift function
{
    srand (time (NULL));
    long a = rand() % (long)pow(2,u);
    if ((a>>1)<<1 == a)
        a = a + 1;
    long h = ((a*x) >> (u-k));
    printf("%ld\t%ld\n", x, a); 
    return h%m;
}

此处uk是全局变量。如果我在循环中调用此函数,如下所示 -

for (int i = 0; i<5; i++)
   mulShift(15);

我得到以下输出 -

  

15 528638629

     

15 528638629

     

15 528638629

     

15 528638629

     

15 528638629

但是,如果我在for循环之前使用srand,如下所示 -

srand(time(NULL));
    for (int i = 0; i<10; i++)
    {
        printf("%d\n", rand()%1000000);
    }

输出更改如下 -

  

638629

     

290058

     

512341

     

826358

     

80629

为什么这种行为有所不同?如果我在最后一个示例中将srand()保留在for循环中,它会再次开始同时打印相同的值。如果这是一个愚蠢的问题,我会提前道歉。

另外,我在Ubuntu上使用GCC,如果它有所作为。

1 个答案:

答案 0 :(得分:0)

以下是MSVC中rand()unsigned long rand_key; void srand(unsigned long seed) { rand_key = seed; } int rand(void) { return ((rand_key = (rand_key * 214013L + 2531011L)) >> 16) & 0x7FFF; } 的实现。

srand()

其他平台上的实现可能有所不同,但它们基本相同(从当前数字计算下一个数字)。因此,使用相同的种子调用#include <time.h> #include <unistd.h> srand( (unsigned)time(NULL) ^ getpid() ); 可以保证生成完全相同的序列。

你可以混合一些东西来获得更好的种子:

componentWillMount