【发布时间】:2013-11-12 12:16:12
【问题描述】:
我是 C 编程新手,我的任务是创建一个二维数组,该数组使用 random () 函数存储 A-Z 中的随机字母。我知道怎么做随机数。
nextvalue = random ( ) % 10001;
但不确定如何准确地创建随机字符。我知道您可以使用 ASCII 使用 ASCII 表中的 65 - 90 范围创建随机字符。谁能帮我想出一个解决方案?我将不胜感激。
【问题讨论】:
我是 C 编程新手,我的任务是创建一个二维数组,该数组使用 random () 函数存储 A-Z 中的随机字母。我知道怎么做随机数。
nextvalue = random ( ) % 10001;
但不确定如何准确地创建随机字符。我知道您可以使用 ASCII 使用 ASCII 表中的 65 - 90 范围创建随机字符。谁能帮我想出一个解决方案?我将不胜感激。
【问题讨论】:
您应该对系统的字符编码进行一些假设。假设它是ASCII 或UTF-8,让我们将自己限制为拉丁字母表的26 个大写字母ABC...XYZ。
然后你可以编码:
char randomletter = 'A' + (random() % 26);
这不适用于EBCDIC。你也可以试试
char randomletter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random () % 26];
适用于任何编码(包括 EBCDIC、ASCII、UTF-8、ISO-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 ь 不是字母,即使它看起来像一个字母。在arabic、hebrew、korean、cherokee、thai 中定义什么是字母……也应该很有趣,而且是无休止的辩论问题……
【讨论】:
random() % 26 没有给出均匀分布的结果。然而,假设RAND_MAX 是 2147483647,数字 0 - 23 有一个额外的机会被选中,但偏差非常小。更大的问题是,如果序列中存在一些通过 2 或 13 修改而暴露的隐藏循环。在我的计算机上,文档说没有。
random()&01 将产生一个随机二进制值。"
warning: implicit declaration of function 'random' is invalid in C99 [-Wimplicit-function-declaration]
我想你已经解决了这个问题。你只需要更加努力地思考和修补它。 在 C 中,您可以轻松地以 Dec 格式显示任何 ASCII 字符。 这是ASCII Table 供参考。 例如
char c = 65;
char c = 'A'; // Both are the same thing.
所以它可能与生成 65 到 90 之间的随机数相同。希望这会有所帮助;)我也是 C 的新手,具有 C++ 的一些背景。
【讨论】: