2011-11-29 33 views
7

我寫了下面的C代碼,當我循環時,它返回一個隨機數。如果myrand()被執行,我怎樣才能達到5個不同的隨機值?蘭德與種子不返回隨機函數循環

#include <stdio.h> 
#include <stdlib.h> 

int myrand() { 
    int ue_imsi; 
    int seed = time(NULL); 
    srand(seed); 
    ue_imsi = rand(); 

    return ue_imsi; 
} 

int main() 
{ 
    int value = 0; 
    int i=0; 
    for (i=0; i< 5; i++) 
    { 
     value =myrand(); 
     printf("value is %d\n", value); 
    } 
} 
+8

Seed **曾經**在你的生活中,而不是所有的時間。 –

+0

您正在使用相同數字重複初始化隨機數生成器(只要'time(NULL)'返回相同的值)。不要這樣做,如果你想讓數字看起來像隨機。還要記住'#include '爲'time()'原型。 – pmg

+1

[總是重複的數字由rand()給出的可能的重複](http://stackoverflow.com/questions/4859089/always-repeated-numbers-given-by-rand)。在提問前請使用SO的搜索功能。 –

回答

19

播種發電機應做一次(你想生成的隨機數的每個序列當然!):

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int seed = time(NULL); 
    srand(seed); 
    int value = 0; 
    int i=0; 
    for (i=0; i< 5; i++) 
    { 
     value =rand(); 
     printf("value is %d\n", value); 
    } 
} 
+0

蘭特()可能有一個低週期,所以我仍然會調用srand時間(如果在一個大循環中) –

4

移動電話srand()進入main(),在循環之前。

換句話說,調用srand()一次,然後調用rand()反覆,沒有任何進一步的調用srand()

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int value = 0; 
    int i = 0; 
    srand(time(NULL)); 
    for (i = 0; i < 5; i++) 
    { 
     value = rand(); 
     printf("value is %d\n", value); 
    } 
} 
+0

errr。是的,它的工作。但爲什麼? – xambo

+2

@xambo:當你連續幾次調用'time()'時,它很可能會返回相同的值,因爲時鐘沒有打勾。當你用同樣的種子調用srand()時,以下對rand()的調用將返回相同的值。正如我所說的,不要在每次需要隨機值時重新初始化發生器。 – NPE

0

種子的點()是與已知值開始的隨機數序列,
然後你會總是得到給定相同種子的相同數字序列。

這就是爲什麼你必須種子(),它都可以讓你生成測試相同的序列,或給予一個隨機種子(通常是時間)每次

2

試試這個你會得到不同的序列:

#include <stdio.h> 
#include <time.h> 
int main(void) { 
    for (int i = 0; i < 10; i++) { 
     printf("%ld\n", (long)time(NULL)); 
    } 
} 

我「猜」是10個等於值將被打印出來:)

+0

這不是一個答案。 (_但它確實解釋了OP_的部分問題) – JeromeJ

-1

如果你想補種(用於額外隨機性)每次調用random()時間,這裏是你可以做一個塔路T:

srandom(time(0)+clock()+random()); 
  • time()每秒鐘更新一次,但會有所不同每次運行您的程序太多
  • clock()更新更頻繁,但是從0開始,每次時間運行您的程序
  • random()如果您的循環比粒度更快,請確保您(通常)不會連續兩次使用相同的值重新編號。clock()

當然,如果你真的需要隨機性,你可以做更多 - 但這是一個開始。

+0

Oops - 使用'clock()'在這裏不會增加太多價值,因爲如果你的程序沒有任何I/O延遲,那麼它大致是確定性的。 – nobar

+0

那麼除非你始終得到0,否則時鐘將會增加至少一些額外的熵,所以它很重要。 – this

+0

http://scruss.com/blog/2008/10/12/pgmrnoise-a-more-random-or-less-repeatable-pgmnoise/ – nobar