سؤال

وأنا أحاول أن تولد التباديل عشوائية من سلسلة ثابت 80-حرف في C. الكثير لاستيائي، ونظام أعمل على يفتقر strfry (). ما هي أفضل طريقة بالنسبة لي لتوليد التقليب عشوائية من هذه السلسلة؟ منذ سيتم يحلق أكثر من هذا تقريبا. 100،000 مرة، والأداء هو قضية.

هل كانت مفيدة؟

المحلول

ومجرد استخدام تنفيذ المصدر المفتوح سي العمومية، كما وجدت من قبل <وأ href = "http://www.google.com/codesearch/p؟hl=en#WbTnQ5DcqbM/glibc-2.1.3/string/strfry.c&q = strfry "يختلط =" noreferrer "> مدونة جوجل .

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;
}

وقد ترغب في تغيير أنواع سي العمومية بيانات محددة إلى شيء أكثر عمومية.

وهذا الرمز يستخدم فيشر ييتس خلط الذي هو في الواقع من السهل جدا لتنفيذ من قبل نفسك، وفعالة جدا.

نصائح أخرى

وإنشاء مجموعة من 80 خط، ووضع الحرف ورقم عشوائي في كل سطر من مجموعة، ثم فرز مجموعة على أرقام عشوائية.

وإعادة بناء سلسلة من مجموعة تم فرزها.

وgcry_randomize الفراغ (الحرف غير الموقعة * العازلة، طول size_t، التعداد مستوى gcry_random_level)

وعازلة تعبئة مع بايت عشوائية طول باستخدام نوعية عشوائية كما هو محدد من قبل المستوى.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top