本文主要是介绍计算两个随机数互为素数的概率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
研究这个问题开始,先研究随机数的做法
随机数这里用伪随机数就够了,这里需要用到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左右。
这篇关于计算两个随机数互为素数的概率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!