簡體   English   中英

為什么每次編譯並運行rand()都會得到相同的結果?

[英]Why do I get the same result with rand() every time I compile and run?

每當我運行此代碼時,我都會得到相同的結果。

程序

#include<stdlib.h>

int main(int agrc, const char *argv[]) {
 int i = rand();
 printf("%d\n",i);
 for(i=0;i<10;i++) {
  printf("%d\n",rand());
 }
}

結果:

41
18467
6334
26500
19169
15724
11478
29358
26962
24464
5705

我在mingw上運行它。 其實我正在學習Objective-C

請幫我。

您必須在使用唯一編號之前為rand函數添加種子。 最簡單的方法是使用time()

例如

srand(time(NULL));
rand();//now returns a random number

原因是rand()提供的隨機數(或任何其他基於算法的函數)不是隨機的。 rand函數僅采用其當前數值狀態,應用轉換,將轉換結果另存為新狀態並返回新狀態。

因此,要讓rand返回不同的偽隨機數,您首先必須將rand()的狀態設置為唯一。

您要初始化PRNG。

調用一次 (通常在main()內部),並調用srand()函數。

如果不初始化PRNG,則默認為使用值1對其進行初始化。 當然,使用其他一些常量初始化它不會為程序的不同運行提供不同的偽隨機數。

srand(1); /* same as default */
srand(42); /* no gain, compared to the line above */

您需要使用一個隨程序每次運行而變化的值進行初始化。 time()函數返回的值是最常用的值。

srand(time(NULL)); /* different pseudo random numbers almost every run */

time(NULL)的問題在於它在同一秒返回相同的值。 因此,如果您在同一天的11:35:17兩次調用程序,則將獲得相同的偽隨機數。

只是為了增加Yacoby的答案-我對它沒有默認為基於時間的種子感到有些驚訝,所以我查閱了手冊頁

如果沒有提供種子值,則rand()函數將自動以1值作為種子。

因此,如果將代碼更改為使用seed(1)您仍然應該看到相同的輸出-但是seed(time())會使它每次都更改。

rand的輸出是隨機的,這意味着它看起來實際上是隨機的,但是每次都從一個稱為種子的特殊值開始,以相同的方式進行計算。 使用相同的種子值,您將獲得相同的隨機數序列。

要設置其他種子,請在開始生成隨機數之前在代碼中使用一次標准C函數void srand(unsigned int) 每次運行程序時,獲取不同隨機數序列的一種常見方法是將種子基於時鍾時間。 例如srand(clock())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM