看板 C_Chat作者 seeghost945 (見鬼噢)標題 Re: [閒聊] 1%的抽卡率抽100次機率是63.4%?時間 Tue Jun 4 11:17:22 2019
※ 引述《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上做
在來比較最後的數值是否相似,以兩種不同的路來驗證最終結果沒問題
以上小弟淺見,還望各路大神鞭小力點
--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.251.182.68 (臺灣)
※ 文章代碼(AID): #1SzUB8YE (C_Chat)
※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1559618248.A.88E.html
※ 同主題文章:
Re: [閒聊] 1%的抽卡率抽100次機率是63.4%?
06-04 11:17 seeghost945.
推 kaj1983: 我是從QB開始學...3F 06/04 11:24
推 arrenwu: 其實我覺得第一個學C挺怪的就是7F 06/04 11:29
→ arrenwu: 打錯,我是要說第一個語言學C++挺怪的9F 06/04 11:29
會說學C/C++打基礎,是因為比較低階,新人可以學習電腦程式的邏輯思考方式
我們系上大一程式設計課 上學期是先教Python,對於程式完全沒學過的人比較好上手
下學期才開始教C/C++,把程式邏輯基礎打好
不過我高三學測完就先翻書自學C了 :P
※ 編輯: seeghost945 (60.251.182.68 臺灣), 06/04/2019 11:36:54
推 Giornno: python真的很不錯,c和c++的語法和方法太繁複了,做什麼都要一套流程10F 06/04 11:31
→ arrenwu: static-typed 語言寫起來就很累啊
C/C++ 更麻煩的是沒有 garbage collection12F 06/04 11:32
→ bbkingck: 大一上學校教c++根本害人14F 06/04 11:34
→ arrenwu: 不過現在 MATLAB 做得到的事情Python幾乎都可以做了吧?15F 06/04 11:35
→ rofellosx: 第一個學C怪在哪?頂多就沒python豐富 支援一堆..17F 06/04 11:36
→ arrenwu: 第一個學C很ok,是學C++很怪18F 06/04 11:36
推 CorkiN: 很多工學院大一也都教C++
但感覺不是很適合...19F 06/04 11:37
→ arrenwu: 我知道啊 因為我們當初也是教C++ 課本就螞蟻 對吧?21F 06/04 11:37
推 Giornno: c->c++->others22F 06/04 11:38
推 seaEPC: 語言好不好用看用在哪,殺雞用牛刀怪刀不好用是很奇怪的事23F 06/04 11:38
→ Giornno: c算很簡單的,c++導入物件概念,再來是其他24F 06/04 11:39
推 Xinlong: 真的是要看用在什麼地方 如果你是寫driver跟寫app用的語言本來就不會一樣25F 06/04 11:41
推 arrenwu: 我之所以提C比C++做為第一個語言較佳就是因為硬體的關聯我不太懂為什麼教C++的一開始就 cout 和 << ,這兩者涉及了class 和 operator overloading 的概念
而且很多教授直接噴 string class 出來存字串
這反而會妨礙學生理解字串的處理
但是在 C 裡面你就只有 char[]28F 06/04 11:43
推 Anzar: arrenwu有沒有北七如我也看的懂得說法啊 ....34F 06/04 11:45
→ arrenwu: 簡單的說就是C++的教學一開始常常使用高級咒文,但C會從初級元素魔法開始35F 06/04 11:45
推 CorkiN: 樓上把c++primer前面幾章讀一下就會大概知道a大在說啥37F 06/04 11:46
推 Xinlong: c++跟c的關係 用比較簡單的說法就是c++多了物件概念38F 06/04 11:46
→ rofellosx: 過時的高級咒文... 理解物件我認為要學java..39F 06/04 11:47
→ Xinlong: c比c++的東西少 當然比較好學(X40F 06/04 11:47
→ arrenwu: 所以你在用C的魔法時,雖然看起來好像不太俐落,但你很了解你在幹什麼41F 06/04 11:47
以cout和<<的例子來說
int a, b;
printf("%d, %d", a, b);
這樣我們可以知道只會印出兩個數字
std::cout<<a<<b;
可以一直<<下去,但對新手而言根本不知道程式實際上到底做了什麼,只知道這樣會吐出兩個數字
更別說當
int a; char b[10]; string c;
std::cout<< a << b << c;
不同型態都可以直接透過<<輸出
優點是寫起來簡單
缺點是新手根本不知道原理
用魔法來看就是
都打算從頭學魔法了,不先學火元素控制原理
直接唱人家發明好,可以直接噴火的魔法
而且還可以火水風元素都適用
→ laechan: 用c寫一些數學算式還沒那麼不堪啦,純文字下c算簡單易懂43F 06/04 11:48
→ arrenwu: C++是高級魔法師把複雜魔法簡化給你用,但你其實只看得到44F 06/04 11:48
※ 編輯: seeghost945 (60.251.182.68 臺灣), 06/04/2019 12:01:12
→ arrenwu: 效果跟某些初級魔法很像,但實際上哪裡不同你搞不清楚45F 06/04 11:48
推 Anzar: 你這例子真是淺顯易懂,感恩~46F 06/04 11:48
推 CorkiN: a大好神==47F 06/04 11:49
推 eastnoon: 我先推才不會讓人覺得我看不懂48F 06/04 11:49
→ Anzar: Cork要求的也太困難了啦 grgrgr50F 06/04 11:49
→ arrenwu: 因為我在學C之前我從來沒搞懂C++到底怎麼弄字串的51F 06/04 11:49
推 fragmentwing: fortran跟C到底哪個快啊 之前看到有人說90在現代也還是很快52F 06/04 11:50
推 Xinlong: 換CPU比較快(X54F 06/04 11:50
→ arrenwu: 而Java跟C++這兩大高階魔法系統有一個很類似的哲理,但有55F 06/04 11:51
見習魔法師報到
→ arrenwu: 一個很大的不同是,C++的魔法放久了會對你精神造成負擔,57F 06/04 11:51
→ arrenwu: 然後那個負擔你要自己排除;Java的魔法則是構築式裡面會自己慢慢讓它消失59F 06/04 11:51
→ fragmentwing: 之前學fortran字串理解也還行,畢竟宣告要len
fortran像是在打文章,宣告用integer,dimension,allocatable之類,通通沒有縮寫61F 06/04 11:52
推 Giornno: java有很多東西幫你做好了,摳他就可以了64F 06/04 11:53
推 Anzar: 奇怪,印象中有看到Java要消失不支援的新聞65F 06/04 11:53
→ Giornno: 只是從c跳到java會不習慣,所以接c++比較妥當66F 06/04 11:54
推 arrenwu: 是不習慣標準函式庫太強太威猛嗎XD68F 06/04 11:55
推 CorkiN: 這串釣到一堆神人==69F 06/04 11:56
推 Giornno: c接c++不習慣你是開玩笑,同一個媽生的程式語言70F 06/04 11:56
我一直認為學程式就是為了用程式解決生活上的問題
為了解決問題而去學習程式,就能維持對寫程式的興趣
如果這份熱情可以一直延續到成為工作,那就更棒了
→ dieorrun: 高階語言邏輯都差不多 跳來跳去很快的 玩單晶片才痛苦72F 06/04 11:58
推 arrenwu: 應該說,你到Java不習慣的東西,在C++也會不習慣
Java只是從syntax上面直接強迫你在精神上進入OOP的世界73F 06/04 11:58
推 Giornno: 當然啊,高階的語言大家的電腦都看得懂,特別用一種機器就要用它的機器語言75F 06/04 11:59
→ arrenwu: 但是在怎麼破爛的機器 現在應該都有 c compiler吧77F 06/04 12:00
推 Stat14: 我覺得學數學比較有用KAPPA79F 06/04 12:01
→ arrenwu: 我覺得他應該是想要說 C code 放到 C++ 不會出現error啦80F 06/04 12:01
→ fragmentwing: 從fortran往C開始學超不適應
一堆東西會撞到
比方說C的continue是fortran的cycle
然後fortran自己有另一個代表不做事的continue,常用來跟goto搭配,然後fortran的goto是用行代碼(據說有不少資管唸四年還不知道行代碼是什麼呢),C是用標籤搭配goto81F 06/04 12:01
→ arrenwu: 我倒是從來沒學過Fortran 這語言現在很多人用嗎?
goto在非底層語言上算是一種忌諱了吧XD89F 06/04 12:01
→ rofellosx: C跳C++會混亂是 你會下意識用C的概念去學 問題是物件91F 06/04 12:02
其實也是C Chat(?)
→ rofellosx: 完全是另一個世界 很多C的概念根本不適用 加上語法像93F 06/04 12:03
→ fragmentwing: 第二不適應的是% C是mod fortran是要把資料型態module內的東西拿出來用才會% 然後在C這功能好像是用.?不過C的module似乎很少用,畢竟class比較方便的樣子最不適應的是 fortran的函式是call by reference C是 call by value搭配address
靠 講到fortran那天導聚教授問怎麼會用這個,教授自95F 06/04 12:04
推 tonyhsie: 其實我是完全不會推薦一般人去寫C 不如去寫C#
上手容易度跟內建的API豐富程度差很多
數字還好 字串處理的話 C#是給你車開 C是要自己打造輪子如果程式只是業餘興趣 花大把時間學C是比較沒必要237F 06/04 22:46
推 kaltu: C#只是把method第一個字母改大寫的Java而已(戰241F 06/05 01:59
推 tonyhsie: Java 也可以 不過我覺得 C# IDE 強大太多了 XD242F 06/05 02:22
--