2017-03-03 90 views
1

您好我正在編寫一個程序,該程序將生成10個隨機字符,以形成一個單詞(這是一個遊戲)。生成10個隨機字符

所以這裏是我的功能:

void GenerateTen(int number) 
{ 
    int i; 
    char abc[30]="abcdefghijklmnopqrstuvwxyz"; 
    char newabc[8]; 


    for (i = 0; i < number; ++i) { 
     newabc[i] = abc[rand() % (sizeof(abc) - 1)]; 
     printf("%c ", newabc[i]); 
    } 

    newabc[number] = 0; 

} 

數量變量包含10和輸出應該是簡單地在陣列中打印這些10個字符。編譯器沒有錯誤,但程序會生成相同的一組字符。感謝您的幫助! :-)

+0

程序生成相同的字符集 - 這是什麼意思?這裏的實際問題是什麼? –

+0

它應該隨機生成不同的集合 – Erail

+1

您真的想在循環前使用'newabc [i] = abc [rand()%strlen(abc)]'爲了效率,預計算:'len = strlen(abc) i] = abc [rand()%len]'。 'sizeof'會在某些點注入0x00。而且,如果你得到相同的數字,你可能想要查看'srand'函數(例如'srand(time(NULL));''main''是通常的方式) –

回答

2

我得到了你的問題。你必須播種它。用時間播種是個好主意:srand()

rand()返回pseudo-random數字。它根據給定的算法生成數字。該算法的起點總是相同的,所以您會看到每次調用都會生成相同的序列。

你可以用srand函數(只在程序中調用srand一次)設置隨機發生器的「種子」。以獲得從RAND)不同的序列(一種常見方式發生器是設置種子爲當前時間或處理的id:

函數srand(時間(NULL));srand(getpid());在節目的開始。

參考:https://stackoverflow.com/a/1108810/5352399


如下,您可以更新您的代碼。

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

int main(void) { 
    srand(time(NULL)); 
    for(int i = 0; i < 5; i++){ 
     GenerateTen(8); 
    } 
    return 0; 
} 

void GenerateTen(int number) { 
    int i; 
    char abc[26]="abcdefghijklmnopqrstuvwxyz"; 
    char newabc[8]; 
    for (i = 0; i < number; ++i) { 
     newabc[i] = abc[rand() % (sizeof(abc) - 1)]; 
     printf("%c ", newabc[i]); 
    } 
    newabc[number] = 0; 
} 

它輸出:

r x r a f d a b 
f f t i x m l b 
r k j e p h d v 
s w a c p g v h 
e n j l r j n w 
+0

按預期工作。非常感謝你! : - ) – Erail

1

您需要使用srand()來初始化僞隨機數生成器。

只需在您的main()後面添加這個項目。

srand(time(NULL)); 

什麼srand(time(NULL))實際上做的是srand()使用產生的種子值僞隨機數,並time(NULL)返回當前日曆時間。

因此,從理論上講,您的srand()函數可以保證在每個運行時獲得不同的種子值。因此,rand()產生的值每次都會有所不同。

0

除了呼籲srand(),你應該非常小心,你實際上是分配8個元素的數組(char newabc[8])和索引它到number,所以你當number >= 8)應該預期緩衝區溢出)。由於你沒有返回它,你可以刪除它。如果您打算在返回它,你應該事先分配它:char* newabc = (char*)calloc(number+1, sizeof(char));

您也可以通過實現abc[rand() % (sizeof(abc) - 1)]實際上是'a' + rand() % 26刪除char abc[30]。除非你想用一個字母子集的自定義字典,在這種情況下,最好將其保存在全局內存中(在函數之外,或者如果你想限制它的作用域,則在函數內部保存爲static)。並且請注意,根據您的架構,sizeof(abc)可能與strlen(abc)不一樣。

所以,這一切的一切,你可以結束了:

char* generate_random(int number) // Better C-style name 
{ 
    int i; 
    char* newabc = (char*)calloc(number, sizeof(char)); 

    if (newabc == NULL) 
     return NULL; 

    for (i = 0; i < number; ++i) { 
     newabc[i] = 'a' + (rand() % 26); 
     // printf("%c ", newabc[i]); // Not needed anymore, except for debugging 
    } 
    // newabc[number] = 0; // Not needed because we used 'calloc()' which zeroes the allocated memory 

    return newabc; 
}