0

我正在使用 gcc 编译器来实现仅使用 getpid() 和 gettimeofday() 的随机数生成器。这是我的代码

#include <stdio.h>
#include <sys/time.h>
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    struct timeval tv;
    int count;
    int i;
    int INPUT_MAX =10;
    int NO_OF_SAMPLES =10;
    gettimeofday(&tv, NULL); 
    printf("Enter Max: \n");
    scanf("%d", &INPUT_MAX);
    printf("Enter No. of samples needed: \n");
    scanf("%d", &NO_OF_SAMPLES);
    /*printf("%ld\n",tv.tv_usec);
    printf("PID  :%d\n", getpid());*/
    for (count = 0; count< NO_OF_SAMPLES; count++) {
    printf("%ld\n", (getpid() * tv.tv_usec) % INPUT_MAX + 1);
    for (i = 0; i < 1000000; ++i)
    {
        /* code */
    }
    }
    return 0;
}

我为延迟目的提供了一个内部 for 循环,但我得到的结果总是相同的。像这样

./a.out 
Enter Max: 
10
Enter No. of samples needed: 
10
1
1
1
1
1
1
1
1
1
1

请纠正我我做错了什么?

4

2 回答 2

1

将 gettimeofday 放入循环中。看看 getpid() 是否可以被 INPUT_MAX + 1 整除,你总是会得到相同的答案。相反,您可以将 getpid()(虽然 () 没有任何意义)添加到 tv.tv_usec。

于 2013-01-14T11:27:28.770 回答
1

getpid()在程序执行期间是常数,所以你也得到常数值。

但即使您gettimeofday()在循环内使用,这也可能无济于事:

  1. gcc 可能会优化您的延迟循环。
  2. 即使它没有被优化掉,延迟也会非常相似,你的值也不会很随机。

我建议您查找“线性同余生成器”,以获取生成更多随机数的简单方法。

于 2013-01-14T07:42:20.500 回答