Рандомизировать строку в C - PullRequest
       12

Рандомизировать строку в C

6 голосов
/ 31 декабря 2008

Я пытаюсь сгенерировать случайные перестановки 80-символьной фиксированной строки в C. К моему ужасу, в системе, над которой я работаю, отсутствует strfry (). Какой лучший способ для меня генерировать случайную перестановку этой строки? Так как это будет зациклено в течение ок. 100 000 раз производительность - это проблема.

Ответы [ 3 ]

13 голосов
/ 31 декабря 2008

Просто используйте реализацию GLIBC с открытым исходным кодом, как указано 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;
}

Возможно, вы захотите изменить определенные типы данных GLIBC на более общие.

В этом коде используется shuffle Фишера-Йейтса , который на самом деле довольно легко реализовать самостоятельно и очень эффективен.

0 голосов
/ 02 января 2009

создать массив из 80 строк, поместить символ и случайное число в каждую строку массива, а затем отсортировать массив по случайным числам.

Перестроить строку из отсортированного массива.

0 голосов
/ 01 января 2009

void gcry_randomize (беззнаковый буфер *, длина size_t, перечисление уровня gcry_random_level)

Заполнить буфер случайными байтами длины, используя случайное качество, определяемое уровнем.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...