2008-12-31 13 views
6

Ich versuche zufällige Permutationen einer 80-stelligen Zeichenfolge in C zu generieren. Zu meiner Bestürzung fehlt das System, das ich arbeite strffry(). Was ist der beste Weg für mich, eine zufällige Permutation dieser Saite zu erzeugen? Da dies über ca. 100.000 Mal ist Leistung ein Problem.Randomize eine Zeichenfolge in C

Antwort

13

Verwenden Sie einfach die Open-Source-GLIBC-Implementierung, wie von Google Code gefunden.

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; 
} 

Möglicherweise möchten Sie die GLIBC-spezifischen Datentypen in etwas allgemeineres ändern.

Dieser Code verwendet die Fisher-Yates shuffle, die tatsächlich sehr einfach zu implementieren ist, und sehr effizient.

+1

Sie könnten das proprietäre Wort dort ändern, sonst könnte Stallman Sie mit seinem Katana bekommen. Ein richtiger Ersatz könnte GLIBC-spezifisch sein. –

+0

Konrad, du bist ein Gentleman und ein Gelehrter! Ich habe versucht, Google Code zu suchen, aber ich suchte nach Dingen wie "zufällige Zeichenfolge in c" statt einfach "strfry". Vielen Dank! – Max

+0

@Vinko: sehr wahr. ;-) –

-2

Hohlraum gcry_randomize (unsigned char * buffer, size_t Länge, ENUM gcry_random_level Ebene)

Füllpuffer mit zufälligen Bytes Länge eine zufällige Qualität unter Verwendung von wie durch Ebene definiert.

http://www.g10code.com/p-libgcrypt.html

+0

Abgesehen davon, dass ich eine proprietäre Funktion bin, von der ich leider nicht gesagt habe, dass ich sie vermeiden möchte, passt das nicht wirklich zu meinem Zweck. Ich versuche, eine zufällige Permutation einer vorhandenen Zeichenfolge zu generieren - keine zufällige Zeichenfolge. Die Zeichenfrequenz ist wichtig. – Max

0

schafft einen 80-Line-Array, setzt ein Zeichen und eine Zufallszahl in jede Zeile des Arrays, dann sortiert das Array auf den Zufallszahlen.

String vom sortierten Array neu erstellen.