C ASCII的随机数,为什么这个代码错了?

时间:2014-09-18 04:31:19

标签: c

char generateRandom(void)
{
  time_t t;
  srand((unsigned) time(%t));

  char choice = (char) rand() % 5 + 65;

  return choice;
}

我正在尝试使用rand()函数从A到G随机生成字符,添加65以使数字范围为65到71,并将其转换为char值。

当我尝试运行时,我收到一条错误,说“在令牌之前预期表达”。

我不太确定我的代码行在语法方面做错了什么。

3 个答案:

答案 0 :(得分:7)

srand((unsigned) time(%t));
//                    ^

应该是:

srand((unsigned) time(&t));
//                    ^

%运算符是二进制运算符(a % b),它尝试查找模数(将a除以b时的余数)。 &运算符是一元运算符(&a),它为您提供指向a对象的指针。您需要在这里使用后者(但请参见下文,因为您实际上需要使用它)。

你还有其他一些问题,其中包括:

  • 您应该将随机数生成器播种一次(可能在main()中),而不是每次都需要一个随机数。

  • 您可以使用srand (time (0))播种,因为传递NULL意味着您不想存储时间。在这种情况下,无需为t变量创建。

  • 表达式number % 5会为您提供从04的值。这只会通过A传递E。您应该使用7

  • 如果您添加'A'而不是幻数65,您的代码将更具可读性。

  • 没有需要将结果投射到某个角色,无论如何,您只会将rand()的结果投射到您拥有的代码(与%一起使用,可能会在默认情况下签署char的环境中产生负数)。如果你想要将整个表达式包括在括号中,你应该将它包括在内,但是我建议你完全删除它。

另外,对于完整的可移植性,你甚至不应该假设这些字母是连续的,因为标准只能保证0-9而不是其它。

如果您担心类型的问题,那么您最好使用以下内容:

char genRandom (void) {
    return "ABCDEFG"[rand() % 7]; // assume srand already called.
}

答案 1 :(得分:1)

更改这两行

srand((unsigned) time(%t));
char choice = (char) rand() % 7 + 65;  //It will not give the characters from A to G

srand((unsigned) time(&t));
char choice = (char) (rand() % 7 + 65); // or remove the cast

答案 2 :(得分:0)

尝试使用此代码,它适用于gcc:

#include <stdio.h>
#include <string.h>
#include <time.h>
main()
{
   srand(time(NULL));
   char rc=(char)(rand()%7)+65;
   printf("%c",rc);
}