这个问题很快:)。我知道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++;
}
}
答案 0 :(得分:3)
我不确定具体格式的含义。但getpid()不是种子的好选择。 PID在“无符号”空间的范围很小,并且很容易猜到。
如果你不关心人们能够猜到你的种子,那么时间(NULL)是种子的更好选择。
答案 1 :(得分:0)
没有两个正在运行的进程具有相同的PID,这是肯定的,但不能保证新进程不会获得与刚终止的进程相同的PID。通常PID会不断增加,但它会迟早溢出(例如在Linux上,默认情况下最大PID为32'768)然后已经使用过的PID将被回收(某些系统也会在此之前回收,例如,他们为不同类型的流程预留了PID范围等等。
下一个问题是rand
在许多系统上是一个非常糟糕的随机生成器(Linux可能是一个例外,但你的标签说“UNIX”)。 BSD甚至在手册页上指出了文学(对于大多数BSD后代来说都是如此,甚至包括MacOS X)。它只与非POSIX代码兼容。所有现代代码都使用random
代替。在大多数系统上它是一个更好的随机数生成器(在其他系统上,它也不比rand()
差,所以你没有任何东西可以使用它)。除非您始终可以确定您的代码永远不会在任何具有“弱rand()
”实施的系统上运行,否则使用random
是安全的方法。
大多数系统都支持呼叫srandomdev()
,这不是POSIX标准的一部分,但它现在几乎可用于所有系统。这通过从系统内核中的随机生成器读取数据来初始化random
(在许多通过/dev/random
可用的系统上)。这个随机数生成器生成非常好的随机数,并且根据系统硬件,它甚至可以生成“真实随机数”。例如。许多现代CPU和一些主板芯片都有硬件随机数发生器,可以产生某种“随机电噪声”的随机数,几乎完全随机 - 如果这样的硬件可用且内核支持它,它会使用它用于生成随机数。