借助标准库中的随机数函数和时间库,制作了一个简易的持签问卜工具。
使用自定义结构体实现。
生成随机数
C生成随机数主要依赖其标准库,<stdlib>
提供了两种随机数函数 rand()
和 srand
。
RAND()
rand()
的机制是利用线性同余法,每次生成一个伪随机数,该随机数的最大范围是 ,如果多次运行该函数,每次生成的随机数都是一样的,如本例中每次抽签得到的签都是同一个。
通用公式 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
的指令来创建并直接在终端页面里编辑代码。