Randomness

C 中的 rand() 函式是如何工作的?

  • March 20, 2013

我想知道 rand() 是如何工作的(即使我沒有提供任何種子它是如何產生 PRN 的?)謝謝!

好吧,連續呼叫 rand() 只會產生“看起來隨機”的數字。

現在, rand() 沒有種子;這意味著每次程序執行時,對 rand() 的呼叫都會生成完全相同的數字序列。這是一個深思熟慮的設計決定;這意味著程序行為是可重現的(如果您正在調試,這可能很重要)。如果您不想要這種行為,那麼這就是提供 srand() 的原因。

至於“看起來隨機”是什麼意思,嗯,它本質上是指“如果你盯著輸出,沒有明顯的模式會跳出來”。

使用密碼學時(您確實在密碼堆棧交換中詢問過),我們對 rand() 沒有太多用處;即使您通過 srand() 輸入種子,該種子通常也太小而無法使用,即使 rand() 輸出沒有明顯的模式,加密對隨機性有更高的標準。

另一方面,其他用途不需要有這麼高的標準。我相信 rand() 在某些隨機算法中可能有用;只是不是加密的。

您可以在 stdlib.c(我在這裡找到)中看到*rand()*定義為:

static long holdrand = 1L;
...
int rand() {
 return (((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
}

當然,這可能因發行版和版本而異。您應該找到本地的 stdlib.c 文件(或與您的發行版相對應的文件)以查看它是如何實現的。srand() 僅僅改變了 holdrand

void srand(unsigned int seed) {
  holdrand = (long) seed;
}

所以正如@poncho 所說,它只會混淆輸出。沒有任何真正的隨機性。

引用自:https://crypto.stackexchange.com/questions/6760