我正在尝试实现乘法移位算法进行散列,并且每次都需要生成一个新的随机数。我使用了一个函数来执行相同的操作,如下所示-
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;
}
这里u
和k
是全局变量。如果我按如下方式在循环中调用此函数 -
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,如果它有什么不同的话。
最佳答案
这是 srand()
和 rand()
在 MSVC 中的实现。
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() );
关于c - C 中 rand() 函数的行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47852386/