研究这个问题开始,先研究随机数的做法
随机数这里用伪随机数就够了,这里需要用到srand()
与rand()
两个函数,这两个函数头文件为stdlib.h
这两个函数的原型为:
一般操作为:先用srand()函数产生随机数种子。计算机产生伪随机数,是通过一系列的函数计算得来的。就是srand()中所返回的参考值,通过计算得到的数字,每次取出其中一个,如果每次使用的都是同一个种子,那么得到的随机数也就是相同的,因此要得到不同的随机数,就需要使用不同的种子数,又不能每次用完一个数字又去手动更换一个种子数,但是时间是会变化的,因此我们使用srand(time(NULL))
来使得每一次的种子数都不同。值得注意的是:srand()函数不要放在循环语句中使用,否则会导致每次的时间过短(不足1s),而产生一系列相同的随机数(这就有点尴尬了)。例如:
解释完随机数之后,就需要来了解下互为素数的算法。可以用欧几里得算法(辗转相除法),只需要计算两个数字的最小公因数为1,就可以得出两者互为素数。
程序如下:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int Gcd(int M, int N);
int main(void)
{
int a, b, c;
srand(time(NULL));
while (1)
{
int i, j, Tot = 0, Rel = 0;
for (i = 0; i < 10000; i++)//这里用了10000组数字做统计
{
a = rand();
b = rand();
//printf("%d\t%d\n\n", a, b);
Tot++;
if (Gcd(a, b) == 1)
Rel++;
}
printf("两个随机数互为素数的概率为%f\n",(double) Rel / Tot);
Sleep(500);//结果出现的不会太快
}
return 0;
}
int Gcd(int M, int N)//欧几里得算法
{
while (N > 0)
{
int Rem = M % N;
M = N;
N = Rem;
}
return M;
}
最后的结果趋近于6/π²(官方数据啦),大概就是0.61左右。