代码放在了了Debian pastezone里,点这里就看得到啦
随机数生成用的是random库,使用mt19937_64生成器根据硬件状态生成
这是真随机数所以要比伪随机数rand()函数安全一些
码代码时的一些趣事
众所周知,Ascii码里是有空格的
于是乎我的程序里有这么while循环来判断随机数是否超出范围或为空格,如果是就运行do里的部分
1
| while (flag < 32 || flag ==39 || flag > 126);
|
其中flag==39就是判断是否为空格
然后我就发现输出里面有几率有空格 难搞哦
然后我一直debug,一直debug,就是找不到问题所在
直到今天查百科,才知道我下载的Ascii码表把32(space)和39(`)弄反了
造孽啊
其实可以打表来着,但是循环写都写了就这样吧
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| #include <iostream>
#include <random>
int main() {
std::random_device md;
std::mt19937_64 rnd(md());
size_t i, j;
int n, flag, mo;
std::cin >> n >> mo;
int num[n];
for (i = 0; i < n; i++)
std::cin >> num[i];
for (i = 0; i < n; i++) {
for (j = 0; j < num[i]; j++) {
flag = (int) rnd() % mo;
do {
do {
flag += (int) rnd() % mo;
} while (flag < 33);
do {
flag %= 126;
} while (flag > 126);
} while (flag < 33 || flag > 126);
std::cout << char(flag);
}
std::cout << std::endl;
}
return 0;
}
|
如何使用
有C++环境的直接编译运行
没有的进入这个链接,把上面的代码复制进去,然后选择运行
在急速运行里输入以下内容,再点击运行
第一行,输入你要生成的密码个数n以及随便一个数字取模,中间使用空格断开
第二行,输入n个数字,为你要生成的密码的长度,中间使用空格断开
例如输入
运行结果为
1
2
3
4
| ?Odo$n8Xf03{
jzVG$O-)aSLp
]'6V>]ijdsCl
Q?$G6/c"Cg>e
|