借助标准库中的随机数函数和时间库,制作了一个简易的持签问卜工具。
使用自定义结构体实现。

生成随机数

C生成随机数主要依赖其标准库,<stdlib> 提供了两种随机数函数 rand()srand

RAND()

rand() 的机制是利用线性同余法,每次生成一个伪随机数,该随机数的最大范围是 [0,2147483647)[0,2147483647) ,如果多次运行该函数,每次生成的随机数都是一样的,如本例中每次抽签得到的签都是同一个。

通用公式 a + rand() % n ;其中的 a 是起始值,n 是整数的范围。

要取得 [a,b) 的随机整数,使用 a + (rand() % (b-a))rand()%8 即表示从 [0,8) 之间输出一个随机数。

#include <cstdio>
#include <cstdlib>
#define charMAX 1000
using namespace std;

struct Augur {    
        int number;
        char issue[charMAX];
    } 
    Augur[7] = {
        0,"计算概论",
        1,"政心期末",
        2,"发政期末",
        3,"助研",
        4,"毕业论文",
        5,"实习报告",
        6,"信息政策"
    };

int main () {
    int n;
    n = rand()%7;
    printf("%d %s\n", Augur[n].number , Augur[n].issue );
    return 0;
}

多次执行之后结果都是

4 毕业论文

因此需要使用可以提供随机种子的随机数函数 srand()

SRAND()

srand() 可以通过设置rand() 产生随机数的生成种子(这是什么?)来获取不同的随机数序列。
可以使用 srand(int)(time(NULL)) ,借助系统时钟,在 time() 库的帮助下,产生不同的随机数种子。

在此基础上修改过的代码即可满足需求。。

#include <ctime>

int main () {
    int n;
    int i=2;
    srand((unsigned int)(time(NULL)));  
    /*将种子设置为2后,输出结果恒为8 申请,不设置时恒定为4 毕业论文。为使其变化,设置为time() 。*/
    n = rand()%9;
    printf("%d %s\n", qian[n].number , qian[n].issue );
    return 0;
}

使用结构体自定义每一支签

(当前版本,不能自定义输入的签)

#include <cstdio>
#include <cstdlib>
#include <ctime>
#define charMAX 1000
using namespace std;

struct Augur {    
        int number;
        char issue[charMAX];
    } 
    qian[10] = {
        0,"计算概论",
        1,"政治心理学",
        2,"发展政治学",
        3,"研究助理",
        4,"毕业论文",
        5,"实习报告",
        6,"信息法",
        7,"托福雅思",
        8,"申请",
        9,"研究助理"
    };

int main () {
    srand((unsigned int)(time(NULL)));  //将种子设置为2后,输出结果恒为8 申请,不设置时恒定为4 毕业论文。为使其变化,设置为time() 。
    int n = rand()%11;
    printf("抽中%d号签——%s: ", qian[n].number , qian[n].issue );
    printf("%d分钟\n", int(30 + rand()% 91));
    return 0;
}

生成可执行文件

上述代码为源代码,为每次执行,需要将源代码编译成可供计算机执行的可执行文件。
本例中源代码放在桌面,编译步骤如下。

cd ~/Desktop
g++ -o ./持簽問卜 ./持簽問卜.cpp 

完成编译后,就可以直接运行该文件

./持簽問卜

或直接雙擊該程序。


值得一提的是,我看的教程还提到可以在 terminal 直接使用 nano hello.cpp 的指令来创建并直接在终端页面里编辑代码。