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.

Était-ce utile?

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.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top