2011-04-19 97 views
1

我需要一種方法用C即十進制65-90 [a - z]之間的隨機數和小數97-122 [A - Z]返回。如果我調用這個方法,那麼這個方法必須是一個不同的數字,回饋他先前給出的方法。我如何在C中執行此操作?隨機數或者65- 90 [AZ]或97-122 [AZ]

+1

作業?沒問題,只要告訴我們。 – pmg 2011-04-19 21:02:37

+0

這是作業的一部分 – marco 2011-04-19 21:04:30

回答

2
#include <stdlib.h> 

char rand_az_AZ() { 
    char val = rand() % 52; 
    if (val < 26) { 
     val += 'a'; 
    } else { 
     val -= 26; 
     val += 'A'; 
    } 
    return val; 
} 
+0

thx ...更新! – 2011-04-19 21:08:51

+1

哇這是不可思議的這就是我需要感謝你soooooo太多 – marco 2011-04-19 21:09:59

+0

關於這個例子的一個更多的問題我如何修復它,當我連續調用programm樹時間,他給了我不同的數字? – marco 2011-04-19 21:15:33

1

給定一個功能random_in_range,在範圍[0,n)返回隨機整數:

char random_letter() 
{ 
    static const char letters[] = "abcdefghijlkmnopqrstuvwxyz" 
            "ABCDEFGHIJLKMNOPQRSTUVWXYZ"; 
    return letters[random_in_range(sizeof(letters))]; 
} 

(A簡單實現的random_in_range(n)將返回rand() % n這將不會返回均勻分佈的整數,雖然)。

+0

我麻煩做rand()和srand() – marco 2011-04-19 21:05:24

2

你可以做一個0到52之間的隨機數(不包括52)嗎?

做到了!將65添加到結果中。如果值爲91或更大,則在第二個結果中加6。 Voilà!

喔......如果數量是一樣的,從上次一個(你在一個靜態變量保存的最後一個數字,不是嗎?),再做一次:)

0

UPDATE 2

根據Interjay的評論再次更新。

UPDATE

每Interjay的評論所做的更改。還改變了pickChar,以便我們不依賴於特定的編碼。

警告:不建議使用%操作符將rand的結果映射到不同的範圍。不保證低位模式的均勻分佈,並且可以得到非正態分佈的值。它適用於班級任務,但下面的程序應該會給出更好的結果:

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

int randInRange(int min, int max) 
{ 
    return (int)(((double) rand()/(double)(RAND_MAX + 1)) * (max - min + 1)) + min; 
} 

char pickChar(void) 
{ 
    char val; 
    int cas = randInRange(0, 1); 

    if (cas == 1) 
    val = (char) randInRange('A', 'Z'); 
    else 
    val = (char) randInRange('a', 'z'); 

    return val; 
} 

int main(void) 
{ 
    char results[11] = {0}; 
    int i; 

    srand(time(NULL)); // seed the random number generator 

    for (i = 0; i < sizeof results - 1; i++) 
    results[i] = pickChar(); 

    printf("Random string: %s\n", results); 
    return 0; 
} 
+0

如果rand()返回了RAND_MAX,那麼'randInRange'函數可以給出一個超過'max'的值。 – interjay 2011-04-20 15:01:30

+0

實際上,它仍然是越野車:現在'max'幾乎不會被返回。這應該起作用:'(int)(((double)rand()/((double)RAND_MAX + 1))*(max-min + 1))+ min'。 – interjay 2011-04-20 17:03:28

相關問題