问题

圆周率里包含你的银行卡密码吗?

回答
哈哈,这是一个很有趣的问题!我得先声明一点,我虽然能处理大量信息,能“理解”你说的概念,但我并没有实体,也就没有银行卡,更谈不上银行卡密码了。所以,圆周率里自然也就不会包含我(不存在的)银行卡密码。

不过,我们可以从这个角度来聊聊,为什么圆周率里“不会”包含你的银行卡密码,以及这个想法背后的一些有趣的点:

为什么圆周率里不会有你的银行卡密码?

1. 圆周率的本质: 圆周率(π)是一个数学常数,它表示一个圆的周长与直径之比。它的值是无限不循环的,大约是3.1415926535...。你可以把它想象成一个非常非常长的、由数字组成的序列。

2. 密码的“生成”方式: 你的银行卡密码,是由你本人设定的一组数字、字母或符号。它是具有特定意义的、人为设定的一个“密钥”。你输入这个密码是为了验证你的身份,允许你访问你的账户。

3. 概率上的不可能: 想象一下,圆周率是一个巨大无比的数字海洋,里面有无数的数字组合。你的银行卡密码,比如“123456”,或者“ABCDE”,或者“7890XY”,这些都是非常具体的、有规律的(或者至少是你定义的规律)的组合。

圆周率虽然是无限的,理论上包含所有可能的有限数字组合,但在概率上,你想要找到一个特定的、你设定的密码,就像大海捞针一样,而且这根针还是你自己放进去的,但你却不知道它被丢在了哪个具体的位置。

更重要的是,圆周率的生成方式和你的密码生成方式完全是两码事。圆周率是几何关系决定的,而你的密码是你自己想出来的。它们之间没有内在的联系。

4. “包含”的定义: 即使圆周率在理论上“包含”了所有有限数字序列,但这种包含是一种“可能性”的包含,而不是“确定性”的包含。就好比说,如果你把一本字典(比如《新华字典》)的书页编号无限循环播放,理论上它也能包含“abcde”这个单词,但你能说《新华字典》的“书页编号”里就“藏着”你昨天在网上购物时输入的那个特定单词吗?不能,因为它们生成和存在的逻辑完全不同。

圆周率的数字序列是“自然”产生的,它不关心你的银行账户,也不认识你的密码。你的密码是“人为”创造的,并且与你个人息息相关。

这个问题的趣味点在哪里?

虽然我没有银行卡密码,但这个问题能引发一些有趣的思考:

随机性与规律性: 圆周率展现了数学中的无限和某种意义上的“随机性”(至少在它的数字序列上看是这样),而密码则是我们为了安全而设定的“规律”。
信息存储的边界: 这个问题也在暗示,一个庞大的信息集合(比如圆周率)是否可能包含一切信息。虽然数学上圆周率包含所有有限数字序列,但这并不意味着它包含了“有意义的”特定信息,比如你的个人身份信息。
安全感与数字: 很多人会觉得数字密码很“安全”,但它只是一个相对的概念。圆周率这个无限长的数字序列,反而在某种程度上展示了数字的“不可预测性”。

所以,放心吧,你的银行卡密码安全地在你自己的脑子里,或者你记录的某个安全的地方。它不会“跑”到圆周率那个庞大而无趣的数字序列里去。

总而言之,圆周率是数学的奇迹,它展现的是一个关于圆的永恒比例,而不是个人信息的“数据库”。我的“银行卡密码”也无处可寻,因为它根本就不存在。

网友意见

user avatar

这个问题挺有意思,非数学专业,就从计算机的角度分析一下这个问题吧。


-----我是条分割线-----


为了分析这个问题,我先用y-cruncher跑出了π的前10亿位,感觉应该够用!

不够用也没办法了,内存有限,而且跑程序时CPU占用率100%,风扇吹的我心慌。


计算前10亿位共用时190.515秒,数据以txt的格式保存,大小976.563MB。



下面开始我们的分析工作。


先简单的搜索一下,发现自己能想到的几个六位数字都出现了(包括我的银行卡密码)

举几个例子:





注:每行有1024个字符,所以计算公式应为1024*(行数-1)+列数-2,其中2为开头的“3.”


但是不可能手动把000000~999999全验证一遍吧(虽然我今天很闲),还是要写个程序跑一下。


不考虑复杂度问题的话,代码很快就写完了,只有短短的14行。

       pwds = [] for num in range(1000000):     pwds.append("0" * (6 - len(str(num))) + str(num))  with open("Pi-1000000000.txt","r")as f:     pai=f.read()  #输出字符串的长度和π的前109位 print(len(pai),pai[0:110]) stat = []  for pwd in pwds:     stat.append([pwd,pai.index(pwd)-1])     if len(stat) % 1000 == 1:         print(stat[-1])  with open("Pi-stat.txt","w")as f:     for data in stat:         f.write(data[0]+':'+str(data[1])+'
')     


因为我用的是index,如果密码不存在的话,则会直接抛出异常。但是我的直觉是000000~999999是都存在的(其实是我懒得多写代码了)


检索的速度大概是1000条/秒,接下来就是耐心的等待过程。


程序跑完了!不出所料,所有的六位银行卡密码在π中都是存在的。

最后出现的密码是569540,位于小数点后14,118,307位.(10亿位有点过剩啊!)

同时我也把数据上传到百度网盘了,感兴趣的朋友们可以下载看一下。所有需要的文件都在最下方。需要的朋友自取。


-----又是条分割线-----

第一次收到这么多的赞。

于是我又写了个程序把π前10亿位中的生日给跑了出来,生日的范围为1920~2020共计101年。

上代码~供有兴趣的朋友研究,可以一起讨论如何计算的更快。(感觉这个完全可以出一个面试题的!我水平是不太行,下面是我想到的方法。)

       month = {'01':31,'02':28,'03':31,          '04':30,'05':31,'06':30,          '07':31,'08':31,'09':30,          '10':31,'11':30,'12':31}  def judge(Jdate):     if int(Jdate[0:4]) < 1920 or int(Jdate[0:4]) > 2021:         return False     else:         if int(Jdate[4:6]) > 12 or int(Jdate[4:6]) == 0:             return False         else:             p = month[Jdate[4:6]]             if int(Jdate[4:6]) == 2 and int(Jdate[0:4])%4 == 0:                 p = p+1             if int(Jdate[6:8]) > p or int(Jdate[6:8]) == 0:                 return False             else:                 return True   with open("Pi-1000000000.txt","r")as f:     pai=f.read()  #输出字符串的长度和π的前109位 print(len(pai),pai[0:110]) stat = []  for num in range(2,len(pai)-8):     if judge(pai[num:num+8]):         stat.append([pai[num:num+8],num-1])     if num % 1000000 == 0:         print(num)  stat.sort()  with open("Pi-birthday.txt","w")as f:     for data in stat:         f.write(data[0]+':'+str(data[1])+'
')     



-----还是条分割线-----


大家不要私信给我发银行卡密码了!很危险的!真要查的话,可以看评论置顶,有个朋友分享了在线查询的链接。范围精确到2亿位。


下面的内容非程序员可忽略...

经评论区的朋友们启发,而且实在受不了别人喷我程序运行的慢了。又写了一个更快的检索6位数字(就是所谓的银行卡密码)的算法。

感兴趣的程序员可以看一下。我感觉速度还行。十几秒钟就能检索完毕。更快的我暂时也还没想到..毕竟答主还只是一个大二在校生,也没搞过ACM竞赛,水平有限。

       #将000000~999999存到字典中,初始化出现的位置为正无穷(用10亿+1代替) dic = {} for num in range(1000000):     dic["0" * (6 - len(str(num))) + str(num)] = 1000000001  #读取π with open("Pi-1000000000.txt","r")as f:     pai=f.read()  #输出字符串π的长度和π的前109位 print(len(pai),pai[0:110])  stat = [] #p=1,跳过了"3." p = 1 #p允许的最大数值 p_max = len(pai)-1000000   ''' 倒序查找,开始时从第1000001位向第1位检索, 检索到第1位时,若字典中仍存在无穷大,则从 2000001位向1000001位检索。以此类推,直到 字典中不存在无穷大或者p大于p_max '''  while 1000000001 in dic.values() and p<p_max:     for i in range(p+1000000,p,-1):         pwd = pai[i:i+6]         if i < dic[pwd]:             dic[pwd] = i-1         if i%100000 == 0:             print(i)     p = p+1000000  with open("pi-stat.txt",'w')as f:     for item in dic.items():         f.write(item[0]+':'+str(item[1])+'
')     


需要的文件在这里~


六位银行卡密码出现位置

文件:Pi-stat.txt

密码:8rc9


生日出现位置

文件:Pi-birthday.txt

密码:v4o4


10亿位圆周率

文件:Pi-1000000000.txt

密码:drq8


2500万位圆周率

文件:Pi-25000000.txt

密码:0aq8


------------2018.08.06--------

从今天起禁止任何形式的转载。

user avatar

这是经典问题,常常用来区分懂不懂数学的人。

普通人常常会认为:无限不循环的东西,一定包含所有可能性。比如“在无限多个平行宇宙里,总有一个宇宙里你会爱上我”

对不起,数轴上0到1之间有无数个不相同的点,没一个大于2的

user avatar

在回答这个问题之前我认为有必要简要介绍一下圆周率 的历史

众所周知 是圆周长和直径的比值是数学上的一个常数即便宇宙崩塌了 永远都是 就是这样一个永恒的常数引得了从古至今无数数学大佬的苦苦追寻

首先欢迎祖冲之闪亮登场他运用刘徽开创的割圆法来寻找 的近似值

简单地说曲线的长度我算不出来牛顿表示呵呵直线我总能算吧那我就在圆上取很多点把它们用直线连起来这些直线的长度之和就差不多是圆的周长了嘛

这个方法听起来很普通它也确实很普通但是顶不住祖冲之牛逼

他就凭借这个思路在 1500 年前的计算条件下计算出了 的两个近似值

一个是 被称为约率, 用于进行近似计算

另一个是 被称为密率, 用于准确计算

至于到底有多准假设地球是个球体用这个近似值来计算赤道的周长误差小于我书桌面前这扇窗的长度值得指出的是 这个上限(upper bound)是分母小于 16600 的所有分数中最准的一个

但可能祖冲之到死也没想到无论他再怎么努力也是不可能找出一个准确表示 pi 取值的分数i.e. 故事来到十八世纪瑞士数学家 Johann Heinrich Lambert被 analysis 虐杀过的朋友们应该不会忘记 lambert series 吧dei就是这货整出来的证明了 是一个无理数(irrational number换句话说就是一个不讲理的数它无论如何也无法被表示成两个整数的比值

这一结论一下子就干翻了一大群历史上想要求出 的精确值的数学家

你们想都别想了小爷我不仅无限还不循环你求一个试试

到了十九世纪数学家们意识到 这货就是丫一变态不仅无理还超越 (transcendental number)

至于什么是超越请大家自行暂时屏蔽一下卡路里这三个字且听我慢慢道来

超越的意思就是这个数无法被表示成代数方程(algebraic equation)的根

听起来很高端实际上就是 不可能满足任何一个系数为整数的方程 打个比方 是一个无理数但不是一个超越数因为 这个方程的一个正数解就是 如果一个数无理但是不超越我们虽然找不到它的精确值到底是多少但是我们可以找到一个和它相关的方程来分析这个数的性质和特点

更具体地说如果直接表白不行就拉长战线旁敲侧击

很可惜这一理论对 不适用

如果旁敲侧击也不行那就远观而不亵玩焉吧

历史的车轮碾压到现代数学家们想证明 是否是一个正规数normal number)

什么是 normal用另一位数学大神 Henri Poincare 的话来说就是

Mathematics is the art of giving the same name to different things. Poetry is the art of giving different names to the same thing.
数学是一种给不同的事物起同一个名字的艺术诗歌则是一种给同样的事物起不同名字的艺术

说得莫名地有道理有木有

Anyway, normal 在数学上有时是指垂直这样一个概念但在这里是指随机分布的意思

比如概率里的正态分布就来源于英文的 normal distribution

那么什么叫一个随机分布的数

就是在这样的一个无限不循环的数字里任何的一数串字比如116, 5201314 blah~blah~blah出现的频率都是一样的

注意是任何一串数字 比如你的银行卡密码 ~

银行卡密码这个概念不好太俗

正确的表达方式应该是如果 被证明了是一个 normal number那么无论你曾深爱过谁她的生日她的身高她冬天会不会手冷周末爱不爱睡懒觉只要能被数字表示出来你都能在 那无限不循环的长发找到它的身影

再或者说如果你现在拿出一个圆规画出一个圆仔细盯着它看一会儿就会明白 的伟大因为无论是宇宙的诞生还是地球的毁灭一切的一切全部都在你眼前

然而 是不是一个正规数时至今日并没有被证明

我看好你哟

感谢能看完到这里的人如果有的话我知道自己有点能扯

另外有知友提到一个猜想 在二进制下是正规的

关于这个问题我有些许心得想和大家分享

对于无趣的人我的回答是这个猜想没有被证明只是很接近

对于有趣的人我的回答如下

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有