社区讨论

随机的神奇性质

学术版参与者 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 条回复,欢迎继续交流。

正在加载回复...