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

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

最佳答案

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

相关文章:

c - 如何显示输出 "Hello"(带引号)?

c - 连续使用返回值作为函数的输入

C 预处理器优先级

python - 是否有用于创建大小为 'n' 的随机数列表的内置函数?

python随机模块种子方法

Vb6 如何制作 0-9 的随机字符串和 x 字符的 a-z

c - 语句含义

c - 在公共(public) block 中有全局变量是一种未定义的行为吗?

java 使用正则表达式生成字符串

python - 将 random.random uniform 转换为指数分布不会产生正确的结果