gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:31:50 26 4
gpt4 key购买 nike

我正在尝试实现乘法移位算法进行散列,并且每次都需要生成一个新的随机数。我使用了一个函数来执行相同的操作,如下所示-

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,如果它有什么不同的话。

最佳答案

这是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com