【问题标题】:Randomize a string in C在C中随机化一个字符串
【发布时间】:2010-09-28 23:54:05
【问题描述】:

我正在尝试在 C 中生成 80 个字符的固定字符串的随机排列。令我沮丧的是,我正在使用的系统缺少 strfry()。我生成这个字符串的随机排列的最佳方法是什么?因为这将循环大约。 100,000 次,性能是个问题。

【问题讨论】:

    标签: c algorithm random


    【解决方案1】:

    只需使用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,其实很容易自己实现,效率很高。

    【讨论】:

    • 你可能想改变那里的专有词,否则 Stallman 可能会用他的武士刀给你。适当的替代品可能是 GLIBC 特定的。
    • 康拉德,你是绅士和学者!我尝试搜索 Google 代码,但我正在寻找诸如“随机化 c 中的字符串”之类的东西,而不是简单的“strfry”。谢谢!
    • 只有我一个人认为创建和使用可重入随机数生成器需要一个漂亮的算法并让它变得丑陋吗?
    • 我想提一下 strfry() 是我最喜欢的函数名称。有一阵子是 floorf(),后来发现 strfry()。
    【解决方案2】:

    创建一个 80 行的数组,将一个字符和一个随机数放入数组的每一行,然后根据随机数对数组进行排序。

    从排序后的数组重建字符串。

    【讨论】:

      【解决方案3】:

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

      使用 level 定义的随机质量用长度随机字节填充缓冲区。

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

      【讨论】:

      • 除了是一个专有功能,恐怕我没有指定我想避免,这实际上并不适合我的目的。我正在尝试生成现有字符串的随机排列——而不是随机字符串。字符频率很重要。
      猜你喜欢
      • 2019-08-07
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 2015-04-04
      • 2015-09-07
      相关资源
      最近更新 更多