计算两个随机数互为素数的概率

研究这个问题开始,先研究随机数的做法
随机数这里用伪随机数就够了,这里需要用到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左右。

猜你喜欢

转载自blog.csdn.net/weixin_49093912/article/details/113063647