2012-04-16 156 views
0

我想找到一個c函數,它可以產生一個32位隨機/僞隨機數,並且可以被複制。 (就像rand/srand函數一樣)。我無法使用urandom,因爲我無法像srand/rand那樣重現序列。我是否必須編寫自己的函數或者做這樣的事情已經存在?隨機發生器

謝謝

爲了將來的參考,而別人的建議是好的。最後我做這樣的事情:

uint32_t generateRandom (unsigned int randomSeed) { 
    uint32_t number = 0; 
    int randomNumber, x; 

    for (x=0; x<8;x++) { 
     randomNumber = rand_r(&randomSeed) % 16; 
     number |= (randomNumber<<(x*4)); 
     randomSeed++; 
    } 
    return (number); 
} 
+3

你爲什麼不使用rand/srand? – MByD 2012-04-16 21:04:21

+4

您的哪些需求使用'rand' /'srand'排除? – 2012-04-16 21:04:29

+0

我試圖寫入一些內存位置(試圖打開和關閉某些位),因爲我需要生成一個32位整數,rand/srand只接受一個unsigned long int ...這給了我一個非常小的數。 – Falcata 2012-04-16 21:06:54

回答

2

加入2 (或更多)rand()結果獲取您需要的位數。
不好(因爲它是誇張的)例子:

uint32_t bit0 = rand() & 1; 
uint32_t bit1 = rand() & 1; 
/* ... */ 
uint32_t bit31 = rand() & 1; 

uint32_t whole = bit0 | (bit1 << 1) | ... | (bit31 << 31); 
+0

謝謝!但有點晚了:P我最終做了類似的事情(見編輯)非常感謝雖然:) – Falcata 2012-04-16 21:57:20

2

RAND_MAX 2147483647 Linux上的,所以如果你不想擴大蘭特()(並消除一半的可能性),使用mrand48()並解釋返回值作爲一個unsigned long

2

從你的問題你的意見,我爲什麼不使用rand()srand()無法捉摸。是否因爲他們不在正確的範圍內?如果是這樣,這樣做:

uint32_t random_num; 
int i, random_byte; 
srand(SEED_VALUE); 

random_num = 0; 
for (i = 0; i < 4; i++) { 
    random_byte = rand() & 0xff; 
    random_num = (randum_num << 8) + random_byte; 
} 

不是最有效的代碼可能,但相當快的和應該做你想要什麼。