2008-12-31 38 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行阵列,把一个字符和一个随机数到所述阵列的每一行,则该随机数字对数组进行排序。

从排序的数组中重建字符串。