※ 引述《fragmentwing (片翼碎梦)》之铭言:
: https://imgur.com/fs1T6T9
: 献丑
: 原本想说要用log去算,发现超不准,只好直接算了
: 怕超过2*32次,就用10次和0.1的机率去算了
: 至少一次的机率==一次+两次+...+N(抽的总次数)次
: 以下程式码,才正式学C不到10天,请鞭小力点
: #include<stdio.h>
: #include<math.h>
: int cntnis(int a,int b){
: int top=1,bottom=1;
: for(int i=1;i<=b;i++){
: top*=(a-i+1);
: bottom*=i;
: }
: int compute=top/bottom;
: return compute;
: }
: double multi(double have,int havet,int nohavet){
: double result=pow(have,havet)*pow((1.0-have),nohavet);
: return result;
: }
: int main(){
: int times,cntn,i;
: double haveis,mulh,probability,expectation=0;
: times=10;
: haveis=0.1;
: for(i=1;i<=times;i++){
: cntn=cntnis(times,i);
: mulh=multi(haveis,i,times-i);
: probability=cntn*mulh;
: printf("抽 %d 次中,抽中 %d 张的机率= %lf\n",times,i,probability);
: expectation+=probability*i;
: }
: printf("抽 %d 次,机率 %.3lf 期望值为: %lf",times,haveis,expectation);
: return 0;
: }
看到原PO说刚学C就想拿来运用,想要鼓励一下原PO,
这才是学程式的精神,学了就是有需要就要想到它,把它要拿出来用
有一些人认为C太低阶,程式码太长,用Python或Matlab打起来比较简单
在这个案例上是没错啦,毕竟只是跑10次循环而已
但如果是跑上万次、甚至是百万次的话,我就建议用C了
我大学念资工时,有一堂课叫做 随机程序
专门就是再学如何写有效率的程式去模拟随机环境,统计十万百万次后,比较是否符合数学上计算的机率
例如:
扑克牌抽三张都是红心,模拟百万次的成功次数
有三个袋子,里面各有红白三颗球,A袋摸一颗球放B袋,B袋摸一颗放C袋,最后C袋摸出红球,模拟百万次的成功次数
诸如此类的各种机率问题,都可以用程式去模拟十万、百万、甚至千万次
这种循环都是要跑很久的,就比较需要可以碰触到低阶的C去写程式
可以break循环就break,尽可能的减少不必要的过程
Matlab就很适合跑一些很难去写的数学式算法,因为都建好函数了
Laplace阿、Fourier都可以直接呼叫
可以画图也是一大优势
我上面用C跑完的百万次随机模拟结果,也可以丢到Matlab去跑分布图 赞赞
再来Matlab是以矩阵做运算的,也很适合去跑图像分析和图像处理
当初实验室学长也有在用Matlab做人脸分析处理的,不过我没有涉猎就不赘述了
Python是我目前看过最好学的程式了
直觉符合人类语言、程式短易读易改、主流多数人都会用
我自己就google自学Python玩过网络爬虫、wikia文本处理机器人、聊天机器人
总结来说
C 适合新手打基础、或是写需要大量运算需要增加效率时使用
Matlab 适合数学计算、数位图像处理
Python 适合快速写简单程式、或是开发一些应用
以原原PO的漫画中例子,我们就可以以C做模拟:
SSR机率1%,抽100次中,如果有中SSR就算成功,模拟百万次,成功几次
以数学理论上就是1-99%^100,这就可以直接在Matlab或是Python上做
在来比较最后的数值是否相似,以两种不同的路来验证最终结果没问题
以上小弟浅见,还望各路大神鞭小力点