C为ASCII的随机数,为什么这个代码是错误的?
我尝试使用rand()函数从A到G随机生成字符,添加65使数字范围从65到71,并将其转换为char值 但是,当我尝试运行此操作时,会出现一个错误,提示“在标记之前需要表达式” 我不太确定我的代码行在语法方面犯了什么错误C为ASCII的随机数,为什么这个代码是错误的?,c,C,我尝试使用rand()函数从A到G随机生成字符,添加65使数字范围从65到71,并将其转换为char值 但是,当我尝试运行此操作时,会出现一个错误,提示“在标记之前需要表达式” 我不太确定我的代码行在语法方面犯了什么错误 char generateRandom(void) { time_t t; srand((unsigned) time(%t)); char choice = (char) rand() % 5 + 65; return choice; } 应该是: sr
char generateRandom(void)
{
time_t t;
srand((unsigned) time(%t));
char choice = (char) rand() % 5 + 65;
return choice;
}
应该是:
srand((unsigned) time(%t));
// ^
%
运算符是一个二进制运算符(a%b
),它尝试查找模数(将a
除以b
时的余数)。&
运算符是一元运算符(&a
),它为您提供指向a
对象的指针。您需要在这里使用后者(但请参见下文,因为您实际上根本不需要使用它)
您还有一些其他问题,其中包括:
- 您应该为随机数生成器设定一次种子(可能在
),而不是每次需要随机数时main()
- 您可以使用
对其进行种子设定,因为传递NULL意味着您不想存储时间。对于这种情况,不需要创建srand(time(0))
变量t
- 表达式
将为您提供一个从number%5
到0
的值。这只会通过4
传递E
。您应该使用A
7
- 如果您添加
而不是魔法数字'A'
,您的代码将更具可读性65
- 无需将结果强制转换为字符,在任何情况下,您只需将
的结果与您拥有的代码一起强制转换(与rand()
一起,在默认情况下签名为%
的环境中,可能会导致负数)。如果要强制转换,应该将整个表达式包含在括号中,但我建议完全删除强制转换char
0-9
的字母是连续的,其他什么都没有
如果你是那种担心这类事情的人,你最好使用以下方法:
srand((unsigned) time(&t));
// ^
改变这两行
char genRandom (void) {
return "ABCDEFG"[rand() % 7]; // assume srand already called.
}
到
请尝试以下代码,它将在gcc上工作:
srand((unsigned) time(&t));
char choice = (char) (rand() % 7 + 65); // or remove the cast
#包括
#包括
#包括
main()
{
srand(时间(空));
字符rc=(字符)(rand()%7)+65;
printf(“%c”,rc);
}
在这一行附近发布更多的代码。标记前的预期表达式“
此错误不是来自这一行。错误在别处。这是函数中除了返回该值之外的唯一代码。%
==>&
。。。。。(无论如何,这不是为prng设定种子的地方,每次进程运行都应该执行一次,最好在第一次使用rand()
之前的main()
开始时执行)。srand((未签名)时间(%t))
这一行。他将%改为a&,以防你注意不到。投票赞成成为第一个指出使用“a”而不是65更好的人。@cWallenpole,我看不到这方面的证据。无论如何,他发布的代码显然有这个问题,在我列出的其他代码中。没有投票赞成不注意演员阵容。见answer of@haccks@rici,我不打算包括每一个小东西,只包括主要的东西。为什么我们现在不假设生成器实际上是基于白噪声的,完全随机的,并且RAND_MAX
是七的倍数:-)
srand((unsigned) time(&t));
char choice = (char) (rand() % 7 + 65); // or remove the cast
#include <stdio.h>
#include <string.h>
#include <time.h>
main()
{
srand(time(NULL));
char rc=(char)(rand()%7)+65;
printf("%c",rc);
}