Domanda

Sto cercando di generare permutazioni casuali di una stringa fissa di 80 caratteri in C. Con mio grande sgomento, il sistema su cui sto lavorando manca di strfry (). Qual è il modo migliore per generare una permutazione casuale di questa stringa? Dal momento che questo sarà ripetuto per ca. 100.000 volte, le prestazioni sono un problema.

È stato utile?

Soluzione

Usa l'implementazione Open Source GLIBC, come trovato da Codice 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;
}

Potresti voler cambiare i tipi di dati specifici GLIBC in qualcosa di più generico.

Questo codice utilizza il Fisher-Yates shuffle che in realtà è abbastanza facile da implementare da te stesso e molto efficiente.

Altri suggerimenti

crea un array di 80 righe, inserisci un carattere e un numero casuale in ogni riga dell'array, quindi ordina l'array in base ai numeri casuali.

Ricostruisci la stringa dall'array ordinato.

void gcry_randomize (buffer char * senza segno, size_t length, enum gcry_random_level level)

Riempi il buffer con byte casuali di lunghezza usando una qualità casuale definita dal livello.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top