c - 下面的 srand(getpid()) 和 rand() 在做什么?

标签 c random ipc fork srand

我希望创建一个优先级列表,其中包含来自 Unix 环境中的 fork 进程的 PID。我找到了以下代码部分,但我不明白 rand 和 srand(getpid()) 正在完成什么。如何使用随机数创建“优先级列表”?

我知道 rand() % (100 - 1) +1; 给了你一个随机数,但为什么代码的作者在减去它之后还要加 1?

for(B = 0; B < noToCreate; B++)     
    {
        pid = fork();

        if(pid == -1)
        {
            perror("Error forking");
            exit(1);
        }
        else if(pid > 0)
        {
            wait(0);
        }
        else
        {
            srand(getpid());

            while(x == 0)
            {
                if(*randNum == 101)
                {
                    *randNum = rand() % (100 - 1) + 1;
                    *pidNum = getpid();

                    printf("priority: %d Process ID: %d \n", *randNum, *pidNum);

                    x = 1;
                }
                else
                {
                    *randNum++;
                    *pidNum++;
                }
            }
            exit(0);
        }
    } /* Closes main for loop */

谢谢大家! :)

最佳答案

srand函数种子 rand 使用的随机数生成器.这是为了确保您不会在每次运行程序时都得到相同的数字序列。

正常使用是使用 time 返回的当前时间,但任何“看似”随机数都可以。不,您不能使用 rand 来创建种子,因为如果没有先前的种子,程序中的第一个 rand 调用将始终返回相同的数字。

至于rand() % (100 - 1) +1部分,就是得到一个1到100之间的随机数。除以随机数 99 (100 - 1) 并使用 0 到 99 之间的余数,然后加 1 得到 1 到 100 之间的值。

关于c - 下面的 srand(getpid()) 和 rand() 在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17880233/

相关文章:

c++ - 使用 MPI_Barrier() 后 MPI_Wtime() 的巨大差异?

javascript - 尝试通过 ipc 将数据从一个 Electron 窗口发送到另一个 Electron 窗口

c - 解码和理解汇编代码

c - scanf(%d,..) 在一个循环中,当给定一个 char once 时不阻塞

c - Linux 中 C 中的递归文件删除

java - 需要一个非常快速的 Java 机制来以随机顺序迭代哈希表中的条目

java - SecureRandom 中 nextXXX() 和 generateSeed() 函数之间的区别?

javascript - 我怎样才能定位我的文字

java - 将 node.js 进程与 java/scala 代码连接起来的最快方法

c - 您会使用退出处理程序做什么?