【问题标题】:generate random characters in c [duplicate]在c中生成随机字符[重复]
【发布时间】:2013-11-12 12:16:12
【问题描述】:

我是 C 编程新手,我的任务是创建一个二维数组,该数组使用 random () 函数存储 A-Z 中的随机字母。我知道怎么做随机数。

nextvalue = random ( ) % 10001;

但不确定如何准确地创建随机字符。我知道您可以使用 ASCII 使用 ASCII 表中的 65 - 90 范围创建随机字符。谁能帮我想出一个解决方案?我将不胜感激。

【问题讨论】:

    标签: c random character


    【解决方案1】:

    您应该对系统的字符编码进行一些假设。假设它是ASCIIUTF-8,让我们将自己限制为拉丁字母表的26 个大写字母ABC...XYZ

    然后你可以编码:

     char randomletter = 'A' + (random() % 26);
    

    这不适用于EBCDIC。你也可以试试

     char randomletter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random () % 26];
    

    适用于任何编码(包括 EBCDICASCIIUTF-8ISO-Latin-1 em>) ....每个 A...Z 字母由单个 char 编码。

    但是this 是一个有趣的答案,它解释了为什么random() % 26 是错误的。在我幼稚的非专家观点中,已经足够了。

    random() % 26 替换为我们定义的myrandomlt26()

    static inline unsigned myrandomlt26() {
       long l;
       do { l = random(); } while (l>=(RAND_MAX/26)*26);
       return (unsigned)(l % 26);
    }
    

    应该稍微好一点(上面的do...while 循环通常应该运行一次)。

    但是,请了解更多信息,例如关于Unicode,您会发现在某些人类语言中,字母(或大写)的概念并不像您想象的那么简单。

    我不是这些问题的专家,但都市传说说,奇怪的是法国人œ 不是一个字母(而只是一个连字),因为在某个 ISO 会议上讨论这个问题时,法国代表生病了。在法国学校,我记得(可能在 1966 年至 1972 年)知道它不是字母(但不是手写合字——它有一个特殊的名字 "E dans l'O"法语-是一个拼写错误),但有些人认为相反。通常像éà 这样的重音字母在法语中被视为字母(但它们的UTF-8 编码需要几个 连续的char....)。同样,我相信并了解到西里尔字母 soft-sign ь 不是字母,即使它看起来像一个字母。在arabichebrewkoreancherokeethai 中定义什么是字母……也应该很有趣,而且是无休止的辩论问题……

    【讨论】:

    • 第二种选择比第一种更棒,因为它是可移植的并且在字符串文字上使用数组索引,这总是很有趣。
    • 是的 random() % 26 没有给出均匀分布的结果。然而,假设RAND_MAX 是 2147483647,数字 0 - 23 有一个额外的机会被选中,但偏差非常小。更大的问题是,如果序列中存在一些通过 2 或 13 修改而暴露的隐藏循环。在我的计算机上,文档说没有。
    • @JeremyP:出于好奇,您的系统是什么,您在谈论哪些文档?
    • OS X。random(3) 的手册页说:“rand(3) 产生的随机序列要少得多——事实上,rand 生成的低十位经过循环模式。 random() 生成的所有位都是可用的。例如,random()&01 将产生一个随机二进制值。"
    • warning: implicit declaration of function 'random' is invalid in C99 [-Wimplicit-function-declaration]
    【解决方案2】:

    我想你已经解决了这个问题。你只需要更加努力地思考和修补它。 在 C 中,您可以轻松地以 Dec 格式显示任何 ASCII 字符。 这是ASCII Table 供参考。 例如

    char c = 65;
    char c = 'A'; // Both are the same thing.
    

    所以它可能与生成 65 到 90 之间的随机数相同。希望这会有所帮助;)我也是 C 的新手,具有 C++ 的一些背景。

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 1970-01-01
      • 2010-12-07
      • 2017-04-11
      • 2017-01-06
      • 1970-01-01
      • 2016-08-20
      • 2017-07-25
      相关资源
      最近更新 更多