2008-12-31 6 views
6

Je suis en train de générer des permutations aléatoires d'une chaîne fixe de 80 caractères en C. À ma grande consternation, le système, je travaille sur manque strfry(). Quelle est la meilleure façon pour moi de générer une permutation aléatoire de cette chaîne? Comme cela sera bouclé sur env. 100 000 fois, la performance est un problème.RANDOMIZE une chaîne en C

Répondre

13

Il suffit d'utiliser l'implémentation Open Source GLIBC, comme l'a constaté 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; 
} 

Vous pouvez modifier les types de données spécifiques GLIBC à quelque chose de plus générique.

Ce code utilise la Fisher-Yates shuffle qui est en fait assez facile à mettre en œuvre par vous-même, et très efficace.

+1

Vous pouvez modifier le mot propriétaire il, sinon Stallman pourrait aller vous obtenez avec son katana. Un substitut approprié pourrait être spécifique au GLIBC. –

+0

Konrad, vous êtes un gentleman et un érudit! J'ai essayé de chercher du code Google, mais je cherchais des choses comme «randomiser une chaîne en c» au lieu de simplement «strfry». Je vous remercie! – Max

+0

@Vinko: très vrai. ;-) –

-2

gcry_randomize void (unsigned char * buffer, longueur size_t, enum niveau de gcry_random_level)

remplissage de tampon avec une longueur d'octets aléatoires en utilisant une qualité aléatoire tel que défini par niveau.

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

+0

En plus d'être une fonction propriétaire, ce que je crains de ne pas avoir spécifié que je voudrais éviter, cela ne correspond pas vraiment à mon objectif. J'essaie de générer une permutation aléatoire d'une chaîne existante - pas une chaîne aléatoire. La fréquence des caractères est importante. – Max

0

créer un tableau de 80 en ligne, mettre un caractère et un nombre aléatoire dans chaque ligne du tableau, puis trier le tableau sur les nombres aléatoires.

Reconstruire chaîne de tableau trié.