2008-12-31 69 views
6

我試圖在C中產生一個80個字符的固定字符串的隨機排列。很令我沮喪的是,我正在工作的系統缺少strfry()。生成這個字符串的隨機排列的最好方法是什麼?由於這將循環大約。 100,000次,性能是一個問題。在C中隨機化一個字符串

回答

13

只需使用開源GLIBC實現,如Google Code所示。

char * 
strfry (char *string) 
{ 
    static int init; 
    static struct random_data rdata; 
    size_t len, i; 

    if (!init) 
    { 
     static int state[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
     rdata.state = NULL; 
     __initstate_r (time ((time_t *) NULL), state, 8, &rdata); 
     init = 1; 
    } 

    len = strlen (string); 
    for (i = 0; i < len; ++i) 
    { 
     int32_t j; 
     char c; 

     __random_r (&rdata, &j); 
     j %= len; 

     c = string[i]; 
     string[i] = string[j]; 
     string[j] = c; 
    } 

    return string; 
} 

您可能想要將GLIBC特定數據類型更改爲更通用的。

此代碼使用Fisher-Yates shuffle這實際上很容易實現,並且非常高效。

+1

您可能想更改那裏的專有詞,否則Stallman可能會用他的武士刀讓你。一個適當的替代品可能是GLIBC特定的。 – 2008-12-31 10:32:28

+0

康拉德,你是一個紳士和學者!我試着搜索谷歌代碼,但我正在尋找諸如「隨機化c中的字符串」而不是簡單地'strfry'。謝謝! – Max 2008-12-31 10:52:21

0

創建一個80行陣列,把一個字符和一個隨機數到所述陣列的每一行,則該隨機數字對數組進行排序。

從排序的數組中重建字符串。