簡體   English   中英

在C中隨機化一個字符串

[英]Randomize a string in C

我試圖在C中生成一個80個字符的固定字符串的隨機排列。令我沮喪的是,我正在研究的系統缺乏strfry()。 對我來說,生成此字符串的隨機排列的最佳方法是什么? 因為這將循環約。 100,000次,性能是一個問題。

只需使用Google Code中的開源GLIBC實施。

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特定數據類型更改為更通用的數據類型。

這段代碼使用了Fisher-Yates shuffle ,它實際上非常容易實現,非常有效。

創建一個80行數組,將一個字符和一個隨機數放入數組的每一行,然后在隨機數上對數組進行排序。

從排序數組中重建字符串。

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

使用由級別定義的隨機質量填充具有長度隨機字節的緩沖區。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM