十天的瓜我不关心,我是典型的工科眼睛老钟,看见技术就忍不住轻哼起来的那种,本帖就特意拆解一下十天的这个概率计算器。为什么说是小拆解呢,因为我是实际上只有这一张图,而且就算拿到了程序的话我对pyinstxtractor等反编译软件的使用依然很生疏,所以只从原理上进行推测。顺带进行一个科学的普及。

首先比较显而易见的是,启动计算器后下面的数字开始跳动,而且变动的位数越来越靠后,再加上括号内的迭代次数,可以轻易猜测得到用的是蒙特卡罗法进行模拟。蒙特卡罗法是一种根据模拟概率过程并且用统计学方法统计随机结果来计算概率分布的方法,具有无偏性和一致性,用中学的话说就是用频率估计概率。
但蒙特卡罗法最大的缺点就是需要收敛,但是由于方舟本身干扰项就不少,所以计算器结果并没有那么可信,所以440次模拟的精度基本上就够用了,所以没做审敛也是很正常的,不过这个直接肉眼审敛看哪几位数字不再跳了也是天才设计,换我的话基本上就是模拟次数1后面闭着眼按0。

但回到十天的程序,有一点比较显著的问题就是为什么收敛速度那么慢?以至于我都怀疑精度已经超出其他干扰项的影响范围了,但是一看title就破案了,因为他用的是tkiner,一个编程非常简单的py3gui小工具,缺点是运行效率不高,而且通过顶帧分析,确认了每进行一次迭代,显示的数字就变了一次。
再结合一下迭代速度超慢的事实,可以得出这实际上是非常草台班子的做法,即把GUI和代码逻辑放到同一个循环结构体中,因为刷新一次GUI所需要的算力远超模拟一次所需要的算力,所以整个进程的速度都会被不断地重绘GUI所拖累,同时刷新速度相较于独立GUI进程对人眼来说,完全没有区别。
以及明显的没有多线程,这种完全不需要考虑多线程安全的程序,竟然没有做多线程,以及前后端分离,不过只能说的确是临时搓出来的,不过的确这样可以为计算器取得更长的展示时间,win。
为方便理解蒙特卡罗法,编写的一段伪代码与其C语言实现:

还是没忍住做了原子化处理保证多线程安全,实际上不做也没问题,就是会有效率浪费

首先比较显而易见的是,启动计算器后下面的数字开始跳动,而且变动的位数越来越靠后,再加上括号内的迭代次数,可以轻易猜测得到用的是蒙特卡罗法进行模拟。蒙特卡罗法是一种根据模拟概率过程并且用统计学方法统计随机结果来计算概率分布的方法,具有无偏性和一致性,用中学的话说就是用频率估计概率。
但蒙特卡罗法最大的缺点就是需要收敛,但是由于方舟本身干扰项就不少,所以计算器结果并没有那么可信,所以440次模拟的精度基本上就够用了,所以没做审敛也是很正常的,不过这个直接肉眼审敛看哪几位数字不再跳了也是天才设计,换我的话基本上就是模拟次数1后面闭着眼按0。

但回到十天的程序,有一点比较显著的问题就是为什么收敛速度那么慢?以至于我都怀疑精度已经超出其他干扰项的影响范围了,但是一看title就破案了,因为他用的是tkiner,一个编程非常简单的py3gui小工具,缺点是运行效率不高,而且通过顶帧分析,确认了每进行一次迭代,显示的数字就变了一次。
再结合一下迭代速度超慢的事实,可以得出这实际上是非常草台班子的做法,即把GUI和代码逻辑放到同一个循环结构体中,因为刷新一次GUI所需要的算力远超模拟一次所需要的算力,所以整个进程的速度都会被不断地重绘GUI所拖累,同时刷新速度相较于独立GUI进程对人眼来说,完全没有区别。
以及明显的没有多线程,这种完全不需要考虑多线程安全的程序,竟然没有做多线程,以及前后端分离,不过只能说的确是临时搓出来的,不过的确这样可以为计算器取得更长的展示时间,win。
为方便理解蒙特卡罗法,编写的一段伪代码与其C语言实现:


还是没忍住做了原子化处理保证多线程安全,实际上不做也没问题,就是会有效率浪费