圆周率各个数字出现的概率一样吗?

         很早之前想过一个问题,就是圆周率既然那么没有规律,这其中会不会有什么规律呢,然后发现了一个规律,那就是,没有规律……

        它的每一位数字虽然都是通过精确计算得出来的,但是会不会存在着随着圆周率位数的增加,各个数字出现的概率一样呢,然后就这问题我开始了尝试,首先,当然是要有数据了,从百度文库里找到了个圆周率前100万位的文档,可是发现虽然整理的很好,文档里却总会每隔50位数出现一些汉字告诉我现在已经有多少位了

 

        本来直接读取文档就好了,你这不是刁难我吗,而且每10位的数字还是连在一起的,我只就干脆当成字符来读取,但是要注意,一个汉字是有两个码值的,想来也是符合逻辑的,每个数字都是在-128到128之间,也就是说可以显示256*256个也就是65536个汉字,完全是够用的,然后我就要读取数据喽,另一个问题又来了,比如会有如下情况“这里是前50位”“这里是前150位”很明显这两句话长度是不一样的,我只好再写一个函数告诉程序下一次要跳过多少个字符→_→,然后就好喽,运行的也很快,一下子就算出来了0到9这10个数字分别有多少个,然后再计算它们分别占了多少个百分比

 

很明显从图中的数据可以看出,随着读取数据的增加,每种数字出现的概率越来越趋向于平均,于是得出不严谨的结论:随着位数的增加,各个数字出现的概率是趋向于平均的。

        虽然这并不严谨,但是就和之前抛硬币得出次数越多越趋向于二分之一一样,没有人能抛无数次硬币来证明这个猜想,所以,当我们没办证明一个东西是错的,但是在人类的能力活动范围内发现它都是对的,那么我觉得它被认为是正确的也没有什么关系,对和错这两个概念都是相对于我们人类自己而言的,花草树木才不管谁对谁错。

        因为我们往往把普遍的能接受的认为是对的,那么错的东西只能是暂时的,思想总是在不停改变,好了不哲学了,下面是实现这一功能的具体源码,另外附加圆周率前100万位文档(用的时候记得把文档名字改成“123”)

 

#include<stdio.h>

#include<ctype.h>    //打开,关闭文档时要用的头文件

 

 

//求位数的函数(用来跳过没用的信息)

int wei(int a){
int b=1,i=10;
for(;;){
if(a/i>=1){
i=i*10;
b++;
}
else break;
}
return b;
}


main(){
int num;
printf("请输入要检索的圆周率位数:");
scanf("%d",&num); 
FILE *fp;
char a[num],ss;
int  s[10]={0},i,j,m,ans=0,n;
float p[10];
if((fp=fopen("123.txt","r"))==NULL){    //打开文档
printf("找不到文档\n");
exit(0);
}
for(i=0;i<num;i++){ 
if(i%10==0&&i!=0){
ss=fgetc(fp);    //跳过空格
ss=fgetc(fp);
}
if(i!=0&&i%50==0){
ans=ans+50;
n=wei(ans);
for(j=0;j<12+n;j++){
ss=fgetc(fp);    //跳过没用的那句话
}
}
a[i]=fgetc(fp);
}
fclose(fp);    //记得要关好
for(i=0;i<num;i++){
s[a[i]-48]++;    //把字符码值变成对应数字
}
for(i=0;i<10;i++){
p[i]=((float)(s[i]))/((float)(num))*100;    //计数
}
printf("\n\n");
for(i=0;i<10;i++){
printf("%d出现%d次 百分比:%.3f\n\n",i,s[i],p[i]);    //打印
}
return 0;

圆周率前100万位.txt

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值