C [重复]中rand()函数行为的差异

问题描述 投票:-1回答:1

这个问题在这里已有答案:

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

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,如果它有所作为。

c random
1个回答
0
投票

这是MSVC中srand()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() );
© www.soinside.com 2019 - 2024. All rights reserved.