在c中生成随机字符

Nic*_*ick 7 c random character

我是C语言编程的新手,已经完成了创建2D数组的任务,该数组使用random()函数存储来自AZ的随机字母.我知道怎么做随机数.

nextvalue = random ( ) % 10001;
Run Code Online (Sandbox Code Playgroud)

但我不确定如何创建一个随机字符.我知道您可以使用ASCII在ASCII表中使用范围65 - 90创建随机字符.任何人都可以帮我提出解决方案吗?我将不胜感激.

Bas*_*tch 27

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

然后你可以编码:

 char randomletter = 'A' + (random() % 26);
Run Code Online (Sandbox Code Playgroud)

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

 char randomletter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random () % 26];
Run Code Online (Sandbox Code Playgroud)

这适用于任何编码(包括EBCDIC,ASCII,UTF-8,ISO-Latin-1)....其中每个A ... Z字母由单个编码char.

但是,是一个有趣的答案,解释为什么random() % 26是错的.在我天真的非专家观点中,这已经足够了.

更换random() % 26myrandomlt26()我们所定义的地方

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

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

但是,了解更多关于Unicode的知识,你会发现有一些人类语言,其中字母(或大写)的概念并不像你所认为的那样微不足道.

我不是这方面的专家,但是城市传说奇怪地说法语œ不是一封信(但只是一个结扎线),因为在一些ISO会议上的法国代表在讨论时感到恶心.在法国的学校,我记得曾经(可能是在1966年至1972年)学到它不是一封信(但不是手写连字 - 在法语中有一个特殊的名字"E dans l'O" - 这是一个拼写错误)但有些人则认为相反.通常用重音字母表示é或者à用法语作为字母(但是他们的UTF-8编码连续几次char ......).同样,我相信并了解到,西里尔软迹象 ?不是一封信,即使它看起来像一个.定义什么是阿拉伯语,希伯来语,韩语,切诺基语,泰语 ...的信也应该是有趣的,无休止的争论问题......