Aléatoire une chaîne en C
Question
J'essaie 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 sur lequel je travaille manque de strfry (). Quel est le meilleur moyen 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.
La solution
Il suffit d'utiliser l'implémentation Open Source GLIBC, comme indiqué par Code Google .
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 propres à GLIBC en un type plus générique.
Ce code utilise le shuffle de Fisher-Yates , qui est en fait assez facile à mettre en œuvre par vous-même et très efficace.
Autres conseils
créez un tableau de 80 lignes, insérez un caractère et un nombre aléatoire dans chaque ligne du tableau, puis triez le tableau sur les nombres aléatoires.
Reconstruire une chaîne à partir d'un tableau trié.
void gcry_randomize (tampon * non signé, taille, taille, niveau gcry_random_level)
Remplissez le tampon avec des octets aléatoires de longueur aléatoire en utilisant une qualité aléatoire définie par le niveau.