我正在尝试使用乘法移位算法进行散列,并且每次都需要生成一个新的随机数。我使用了一个函数来做同样的事情 -
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,如果它有所作为。
答案 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