社区讨论
随机的神奇性质
学术版参与者 5已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mkqb79sq
- 此快照首次捕获于
- 2026/01/23 11:16 4 周前
- 此快照最后确认于
- 2026/01/23 20:08 4 周前
说明:下列所有的奇偶性都能反过来,也成立
起因
同机房大佬lkx在运行下列代码时,发现输出平均是10左右(期望为无穷大):
CPP#include <bits/stdc++.h>
using namespace std;
int f() {
int ans = 2;
while (rand() % 2) {
ans *= 2;
}
return ans;
}
int main() {
srand(time(0));
cout << f();
return 0;
}
于是他开始验证rand函数的随机性,发现运行如下代码,永远不会结束!(正常几毫秒就能跑完):
CPP#include <bits/stdc++.h>
using namespace std;
int main() {
srand(time(0));
int x = 0;
while (++x) {
int flag = 1;
for (int i = 1; i <= 16; i++) {
if (rand() % 2 == 1) {
flag = 0;
break;
}
}
if (flag) {
break;
}
}
cout << x;
return 0;
}
也就是说,rand函数不会出现连续16次偶数!
后来的验证
我使用如下代码,跑得飞快:
CPP#include <bits/stdc++.h>
using namespace std;
int main() {
srand(time(0));
int x = 0;
while (++x) {
int flag = 1;
for (int i = 1; i <= 15; i++) {
if (rand() % 2 == 1) {
flag = 0;
break;
}
}
if (flag) {
break;
}
}
cout << x;
return 0;
}
即,15个连续偶数是有可能出现的
于是,我又想,能不能有连续15个偶数,空一个,再来一个偶数呢?(即a1、a2、……、a15、a17全为偶数,理论概率也是1/2^16):
CPP#include <bits/stdc++.h>
using namespace std;
int main() {
srand(time(0));
int x = 1;
while (x++) {
int flag = 1;
for (int i = 1; i <= 15; i++) {
if (rand() % 2 == 1) {
flag = 0;
break;
}
}
rand();
if (rand() % 2 == 0) {
flag = 0;
}
if (flag) {
break;
}
}
cout << x;
return 0;
}
果然跑得飞快!
因此,我得出结论:若有连续15个数均为偶数,则第16个数必定是奇数
后来,我又尝试用不同的随机数种子,均遵循上述规律
后记
有意思的事情:我运行下列代码10次,7次输出1,3次输出10^8量级的数(???)
CPP#include <bits/stdc++.h>
using namespace std;
int main() {
srand(time(0));
int x = 0;
while (++x) {
int flag = 1;
for (int i = 1; i <= 16; i++) {
srand(rand());
if (rand() % 2 == 1) {
flag = 0;
break;
}
srand(time(0));
}
if (flag) {
break;
}
}
cout << x;
return 0;
}
(不过后来发现是time以秒为单位变化导致的)
总结
这应该是rand的特殊性质,求大佬解答
回复
共 11 条回复,欢迎继续交流。
正在加载回复...