0

这个问题很快:)。我知道srand()用于播种随机数生成器,以防止生成相同的随机数序列。同样,我知道getpid()“应返回调用进程的进程ID”。

http://pubs.opengroup.org/onlinepubs/009695399/functions/getpid.html

由于每次运行我的程序(生产者和消费者通过共享内存进行通信的程序)时进程 ID 最终都会不同,因此 PID 也会不同,从而提供完美的种子。我为随机数设置了一个范围rand() % (100-1) + 1

是否srand(getpid())以特定格式提供随机数?

为了完整起见,这是我的查询涉及的代码部分:

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++;
        }   
}   
4

2 回答 2

3

我不确定您所说的特定格式是什么意思。但是 getpid() 作为种子并不是一个好的选择。PID 在“无符号”空间的一个很小的范围内,很容易猜测。

如果您不关心人们能够猜出您的种子,那么 time(NULL) 作为种子是一个更好的选择。

于 2013-07-29T14:50:51.817 回答
0

没有两个正在运行的进程具有相同的 PID,这是肯定的,但不能保证新进程不会获得与刚刚终止的进程相同的 PID。通常 PID 会不断增加,但迟早会溢出(例如,在 Linux 上,默认情况下最大 PID 为 32'768),然后之前已经使用过的 PID 将被回收(有些系统也比这更早回收,例如他们为不同类型的进程保留了 PID 范围等)。

下一个问题是rand许多系统上的随机生成器非常糟糕(Linux 可能是一个例外,但您的标签上写着“UNIX”)。BSD 甚至在手册页上声明了这种文字(对于大多数 BSD 后代来说都是如此,甚至包括 MacOS X)。它只是为了与非 POSIX 代码兼容。所有现代代码都random改为使用。在大多数系统上,它是一个更好的随机数生成器(在其他系统上,它也不比 差rand(),所以使用它不会有任何损失)。除非您始终可以确定您的代码永远不会在任何具有“弱rand()”实现的系统上运行,否则使用random是安全的方法。

大多数系统都支持 call srandomdev(),这不是 POSIX 标准的一部分,但现在几乎可以在所有系统上使用。这通过从系统内核中的随机生成器读取数据进行初始化random(在许多系统上可通过/dev/random)。这个随机数生成器生成非常好的随机数,根据系统硬件,它甚至可以生成“真实随机数”。例如,许多现代 CPU 和一些主板芯片都有硬件随机数发生器,可以从某种“随机电噪声”中产生随机数,这几乎是完全随机的 - 如果这样的硬件可用并且内核支持它,它将使用它用于生成随机数。

于 2013-07-29T15:13:23.770 回答