Re: [閒聊] 1%的抽卡率抽100次機率是63.4%?

作者: seeghost945 (見鬼)   2019-06-04 11:17:22
※ 引述《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上做
在來比較最後的數值是否相似,以兩種不同的路來驗證最終結果沒問題
以上小弟淺見,還望各路大神鞭小力點
作者: l22573729 (寅猷襹鵀)   2019-06-04 11:20:00
我也是從c開始學
作者: hedgehogs (刺蝟)   2019-06-04 11:23:00
快推免得被說看不懂
作者: kaj1983   2019-06-04 11:24:00
我是從QB開始學...
作者: aleezible (laterproblem)   2019-06-04 11:24:00
喔喔,對對對,跟我想得差不多
作者: jackwula9211 (Carbon.)   2019-06-04 11:25:00
我那時候大家都學C++啊,其實還是滿好用的啦
作者: aikotoba (aikotoba)   2019-06-04 11:26:00
其實我也是這麼想的
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:29:00
其實我覺得第一個學C挺怪的就是
作者: js850604 (jack0604)   2019-06-04 11:29:00
完了我只用過MATLAB
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 11:31:00
python真的很不錯,c和c++的語法和方法太繁複了,做什麼都要一套流程
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:32:00
static-typed 語言寫起來就很累啊C/C++ 更麻煩的是沒有 garbage collection
作者: bbkingck (Twister)   2019-06-04 11:34:00
大一上學校教c++根本害人
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:35:00
不過現在 MATLAB 做得到的事情Python幾乎都可以做了吧?
作者: roger840410 (roger)   2019-06-04 11:36:00
我之前大學資工三個班 其他兩班學c++我們學c
作者: rofellosx (鏖)   2019-06-04 11:36:00
第一個學C怪在哪?頂多就沒python豐富 支援一堆..
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:36:00
第一個學C很ok,是學C++很怪
作者: CorkiN (柯基)   2019-06-04 11:37:00
很多工學院大一也都教C++但感覺不是很適合...
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:37:00
我知道啊 因為我們當初也是教C++ 課本就螞蟻 對吧?
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 11:38:00
c->c++->others
作者: seaEPC (沒看見,我沒看見 >_<)   2019-06-04 11:38:00
語言好不好用看用在哪,殺雞用牛刀怪刀不好用是很奇怪的事
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 11:39:00
c算很簡單的,c++導入物件概念,再來是其他
作者: Xinlong (Ashyjet)   2019-06-04 11:41:00
真的是要看用在什麼地方 如果你是寫driver跟寫app用的語言本來就不會一樣
作者: twosheep0603 (兩羊)   2019-06-04 11:42:00
先學c/c++可以方便銜接計算機概論的硬體知識
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:43:00
我之所以提C比C++做為第一個語言較佳就是因為硬體的關聯我不太懂為什麼教C++的一開始就 cout 和 << ,這兩者涉及了class 和 operator overloading 的概念而且很多教授直接噴 string class 出來存字串這反而會妨礙學生理解字串的處理但是在 C 裡面你就只有 char[]
作者: Anzar (是一隻安薩)   2019-06-04 11:45:00
arrenwu有沒有北七如我也看的懂得說法啊 ....
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:45:00
簡單的說就是C++的教學一開始常常使用高級咒文,但C會從初級元素魔法開始
作者: CorkiN (柯基)   2019-06-04 11:46:00
樓上把c++primer前面幾章讀一下就會大概知道a大在說啥
作者: Xinlong (Ashyjet)   2019-06-04 11:46:00
c++跟c的關係 用比較簡單的說法就是c++多了物件概念
作者: rofellosx (鏖)   2019-06-04 11:47:00
過時的高級咒文... 理解物件我認為要學java..
作者: Xinlong (Ashyjet)   2019-06-04 11:47:00
c比c++的東西少 當然比較好學(X
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:47:00
所以你在用C的魔法時,雖然看起來好像不太俐落,但你很了解你在幹什麼
作者: laechan (揮淚斬馬雲)   2019-06-04 11:48:00
用c寫一些數學算式還沒那麼不堪啦,純文字下c算簡單易懂
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:48:00
C++是高級魔法師把複雜魔法簡化給你用,但你其實只看得到效果跟某些初級魔法很像,但實際上哪裡不同你搞不清楚
作者: Anzar (是一隻安薩)   2019-06-04 11:48:00
你這例子真是淺顯易懂,感恩~
作者: CorkiN (柯基)   2019-06-04 11:49:00
a大好神==
作者: eastnoon (二氧化碳)   2019-06-04 11:49:00
我先推才不會讓人覺得我看不懂
作者: Anzar (是一隻安薩)   2019-06-04 11:49:00
Cork要求的也太困難了啦 grgrgr
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:49:00
因為我在學C之前我從來沒搞懂C++到底怎麼弄字串的
作者: fragmentwing (片翼碎夢)   2019-06-04 11:50:00
fortran跟C到底哪個快啊 之前看到有人說90在現代也還是很快
作者: Xinlong (Ashyjet)   2019-06-04 11:50:00
換CPU比較快(X
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:51:00
而Java跟C++這兩大高階魔法系統有一個很類似的哲理,但有
作者: forsakesheep (家裡蹲魯廢肥宅)   2019-06-04 11:51:00
這篇給我的感想就是程式設計師=魔法師
作者: rofellosx (鏖)   2019-06-04 11:51:00
換硬體比較快+1
作者: fragmentwing (片翼碎夢)   2019-06-04 11:52:00
之前學fortran字串理解也還行,畢竟宣告要lenfortran像是在打文章,宣告用integer,dimension,allocatable之類,通通沒有縮寫
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 11:53:00
java有很多東西幫你做好了,摳他就可以了
作者: Anzar (是一隻安薩)   2019-06-04 11:53:00
奇怪,印象中有看到Java要消失不支援的新聞
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 11:54:00
只是從c跳到java會不習慣,所以接c++比較妥當
作者: rofellosx (鏖)   2019-06-04 11:55:00
c跳c++只會混亂吧..
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:55:00
是不習慣標準函式庫太強太威猛嗎XD
作者: CorkiN (柯基)   2019-06-04 11:56:00
這串釣到一堆神人==
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 11:56:00
c接c++不習慣你是開玩笑,同一個媽生的程式語言
作者: fragmentwing (片翼碎夢)   2019-06-04 11:57:00
對了感謝鼓勵
作者: dieorrun (Tide)   2019-06-04 11:58:00
高階語言邏輯都差不多 跳來跳去很快的 玩單晶片才痛苦
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 11:58:00
應該說,你到Java不習慣的東西,在C++也會不習慣Java只是從syntax上面直接強迫你在精神上進入OOP的世界
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 11:59:00
當然啊,高階的語言大家的電腦都看得懂,特別用一種機器就要用它的機器語言
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 12:00:00
但是在怎麼破爛的機器 現在應該都有 c compiler吧
作者: jonathan793 (pusheen cat)   2019-06-04 12:00:00
c++跟c差很多好嗎? 你才在開玩笑
作者: Stat14 (統計14)   2019-06-04 12:01:00
我覺得學數學比較有用KAPPA
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 12:01:00
我覺得他應該是想要說 C code 放到 C++ 不會出現error啦
作者: fragmentwing (片翼碎夢)   2019-06-04 12:01:00
從fortran往C開始學超不適應一堆東西會撞到比方說C的continue是fortran的cycle然後fortran自己有另一個代表不做事的continue,常用來跟goto搭配,然後fortran的goto是用行代碼(據說有不少資管唸四年還不知道行代碼是什麼呢),C是用標籤搭配goto
作者: Ikaros1110 (神之羽)   2019-06-04 12:01:00
c到c++直接回不去
作者: rofellosx (鏖)   2019-06-04 12:02:00
C跳C++會混亂是 你會下意識用C的概念去學 問題是物件
作者: xdavidchen1 (不信神的神父)   2019-06-04 12:03:00
c_chat(X) C++chat(O)
作者: rofellosx (鏖)   2019-06-04 12:03:00
完全是另一個世界 很多C的概念根本不適用 加上語法像
作者: devilkool (對貓毛過敏的貓控)   2019-06-04 12:03:00
fortran有的老傳產還在用
作者: fragmentwing (片翼碎夢)   2019-06-04 12:04:00
第二不適應的是% C是mod fortran是要把資料型態module內的東西拿出來用才會% 然後在C這功能好像是用.?不過C的module似乎很少用,畢竟class比較方便的樣子最不適應的是 fortran的函式是call by reference C是 call by value搭配address靠 講到fortran那天導聚教授問怎麼會用這個,教授自
作者: NerVGear (Phantom)   2019-06-04 12:06:00
學C很合適吧 指標那邊也帶你學硬體
作者: fragmentwing (片翼碎夢)   2019-06-04 12:06:00
己是學C,我也覺得系上為甚麼要教這個……我們原本要學python的說指標和指標與陣列的一些關係,我花了一個半小時才弄懂
作者: NerVGear (Phantom)   2019-06-04 12:08:00
但是這學期上swift完全不知道在幹嘛==
作者: jeffy84123   2019-06-04 12:09:00
各位討論這麼多,結果你們到底是在討論c++ 幾?
作者: fragmentwing (片翼碎夢)   2019-06-04 12:09:00
C的goto已經有放限制器只能作用在同一block內了你知道,fortran的goto是可以從第十行跳到倒數三行的嗎 所以fortran的goto真的是太過強大的東西,沒寫註解會讓交接的人很頭痛
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 12:12:00
指標和參考是讓你懂,c所用的都是最基礎的觀念,python就沒想得這麼麻煩,我要用陣列要傳參數當然是要它的值啊,我還特地送地址過去幹嘛,我到你家門口告訴你地址到我家取貨,幹嘛不順便送給你咧
作者: NerVGear (Phantom)   2019-06-04 12:13:00
用指標是讓你跟副程式溝通的好ㄇ==
作者: fragmentwing (片翼碎夢)   2019-06-04 12:13:00
沒 陣列是傳址的因為整個傳過去會太慢
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 12:14:00
我說學校教你基礎概念當然用最基礎的c啊
作者: fragmentwing (片翼碎夢)   2019-06-04 12:15:00
比如你傳一個a[] 其實是傳a[0]的位址過去這在取址運算子&上很明顯
作者: NerVGear (Phantom)   2019-06-04 12:16:00
那應該學組語 真 底層
作者: fragmentwing (片翼碎夢)   2019-06-04 12:16:00
所以scanf對char[]是不用&的
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 12:16:00
不在c上面告訴你不然在哪邊告訴你
作者: xsdferty035 (Free逛逛)   2019-06-04 12:18:00
我以為我在C洽原來是軟體版
作者: NerVGear (Phantom)   2019-06-04 12:19:00
不過python速度太慢惹 演算法測資都測不過QQ
作者: jeffy84123   2019-06-04 12:19:00
不同情況適合不同語言寫,根本沒什麼好比的
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 12:20:00
演算法測資測不過怪Python慢好像不太對吧
作者: NerVGear (Phantom)   2019-06-04 12:22:00
速度超時啊應該說時間超時
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 12:22:00
@Giornno Python的 List 是傳地址沒錯喔
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 12:23:00
是MATLAB傳才是整個 deep copy一般時間超時是時間複雜度不一樣了吧?
作者: NerVGear (Phantom)   2019-06-04 12:24:00
時間複雜度一樣啊 但用python跑就比較慢啊
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 12:24:00
挖 你那測資也太..嚴苛了吧
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 12:26:00
什麼,我誤解了這麼久嗎
作者: NerVGear (Phantom)   2019-06-04 12:26:00
之前忘了在學哪個演算法python就要跑0.26秒 但標準0.25
作者: jeffy84123   2019-06-04 12:26:00
這很正常吧 程式設計理念不一樣
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 12:26:00
你現在去run: x = [1,2,3] -> y=x然後改 y[0],你會發現x的內容也會被改道
作者: dryadl88908 (闇夜星子)   2019-06-04 12:30:00
不懂怪在哪,會一個就會全部了,重點在培養寫程式的思考方式,只是不同語言程式的語法不同而已
作者: sleepybaby (睏寶)   2019-06-04 12:31:00
C_Chat 又變C討論板了(為什麼要說又呢
作者: jeffy84123   2019-06-04 12:33:00
演算法跟資料結構搞好比用哪個語言重要
作者: Giornno (喬魯諾.喬三槐)   2019-06-04 12:34:00
沒錯啊,如果總是寫出複雜度平方以上的演算法,用再快的語言也沒救
作者: blazewings   2019-06-04 12:38:00
我直上C+++結果現在學R、Python、java時有障礙...
作者: g5637128 (幫QQ)   2019-06-04 12:41:00
作者: jeffy84123   2019-06-04 12:41:00
你是學c++幾?
作者: ttPttPtt (ttPtt)   2019-06-04 12:46:00
現在都2019了,還有人在C+++==
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 12:48:00
其實你就想,很多人跑模擬還在用MATLAB,所以其實速度上大家不見得會追求到那麼極致
作者: kaj1983   2019-06-04 12:48:00
個人經驗有障礙的通常不是語言差異遇過幾個文組的沒學過c、c++還是寫得有聲有色研究所才開始學寫程式的人也不少
作者: rofellosx (鏖)   2019-06-04 12:50:00
最好是學一個就全部都會 ..工具方法都不太一樣..
作者: NerVGear (Phantom)   2019-06-04 12:55:00
matlab速度很快吧==算矩陣誰比他快的
作者: geroge0820 (可.....可惡)   2019-06-04 12:56:00
應該是說學會一個 其他就觸類旁通 很快就會了
作者: ykes60513 (いちご)   2019-06-04 12:58:00
Python速度慢 語法又很寬鬆 還是很多人用啊
作者: rofellosx (鏖)   2019-06-04 13:18:00
寬鬆?
作者: kzlivetune (livetune)   2019-06-04 13:23:00
對啊我以前也這樣說可是沒人認同
作者: as80110680   2019-06-04 13:33:00
語言確實有很多共同觀念,例如基本的迴圈遞迴演算法,但多的是不共通的語言特性,記憶體分配、指標、reference,不要以為像reference很容易,光是c++的左值右值就搞死你了,我到現在都不敢說我多會c++
作者: super502 (芋片)   2019-06-04 13:35:00
以美國公司面試都要現場寫code來說 你說你要以python來接受測試是會被工程師瞧不起的 反而資料結構跟演算法學好來 公司看到你特別的地方會直接給你錢請你去總公司面試
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 13:36:00
用Python寫code會被瞧不起? 現在還有這問題喔?我知道面試好像比較偏愛Java沒錯
作者: a2334436 (<lol>)   2019-06-04 13:38:00
優文
作者: greatloser (Alfred)   2019-06-04 13:48:00
目前大三資工,後悔小時候沒多接觸程式,現在很痛苦
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 13:49:00
別怕啊 這一兩個學期你降會很習慣了
作者: as80110680   2019-06-04 13:55:00
我大二才從文組轉到資工,有興趣很快就會習慣了
作者: archer646 (DozinessIsGood)   2019-06-04 14:04:00
我一下寫c一下寫verilog 就快死了
作者: banana1 (香蕉一號)   2019-06-04 14:05:00
國中的時候摸過C,隔了十幾年年沒碰程式,之後看python還是很容易上手
作者: Litfal (Litfal)   2019-06-04 14:17:00
想寫程式練功心態是對的啦,但這問題真的不用迴圈來算用上機率統計和常態分佈的概念,迴圈可以省起來
作者: kaltu (ka)   2019-06-04 14:26:00
除了要接著學資料結構和組合語言的資工系學生之外,母語都沒有必要選CC的learning curve太反人類,母語腔調又很難擺脫,用他當母語荼毒過的人腦袋直接上了思想僵化+9的DEBUFF要理解其他paradigm難度直線往上跳一堆人拿著C++、JVM Python照著C的convention在寫把C library字典對換成C++ equivalent就當自己在寫C++,連template都不會用C++自己就算不用C style的for(int i … ),我覺得Iterator比較潮,不不通通來給我用range-based for開個static public Main()從頭到尾call static method,什麼是OO?什麼是design pattern?DP我知道啊 我高中ZeroJudge就在用的Dynamic Programming那個嘛然後跟你說「啊每個語言都一樣,會C就會寫C++/Java/…,你看會動啊!」每種語言都有他們自己特殊的味道那種覺得語言沒差都一樣,通通照著自己那一套寫的人,寫出來的東西其他人合作起來有多臭自己都聞不出來舉個例子,要寫Python就算沒辦法寫得夠Pythonic,至少codestyle給我去把PEP8讀過一遍再來,私人專案沒關係,要公開之前先sanitize一下不要臭到別人也不是說寫C的就不臭,去翻一下GNU standard library人家是用怎麼樣的慣例在寫C的,不要自己惡搞能把虛擬碼換成某種語言跑起來,不代表你會那種語言,大家都有的功能不重要,重點是你有沒有弄懂為什麼這個語言存在的核心feature和什麼才是他的特色。嫌Python慢之前,如果你知道Cython在幹嘛,知道Python為什麼又稱glue language,你就會用C來寫core然後Python寫wrapper的方式來Pythonic地實作你的演算法然後再接駁給其他系統Python的設計目的是減少人類的開發時間和各種重要元件之間的串接overhead、作為複雜系統的前端語言,例如深度學習引擎不約而同選用Python作為前端,C/CUDA作為後端一樣
作者: chean1020 (嘻嘻)   2019-06-04 14:32:00
結果這一串沒有經典引戰笑話XDDD,我以為是有人引戰說了什麼xxx是世界上最好的語言才這麼多推
作者: laechan (揮淚斬馬雲)   2019-06-04 14:45:00
看來專家很多,想問一下,為啥學校教的跟業界要的落差很大
作者: greatloser (Alfred)   2019-06-04 14:47:00
要引戰的話先從tab還是4格空白開始聊吧再來聊IDE背景顏色要深色還淺色
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 14:56:00
我支持IDE背景要深色
作者: zybaster (小賽)   2019-06-04 14:58:00
應該說學c容易習慣從下往上堆的思考,而c++,java..etc通常是由上往下長的思路去設計的,沒切換過來撞牆是必然的
作者: shuncheng (shuncheng)   2019-06-04 14:59:00
我都用tab 打C用深色 Matlab用淺色 Latex深淺看心情
作者: rofellosx (鏖)   2019-06-04 15:09:00
因為學校不會教你實作...要自行摸索再來C++的教科書很爛
作者: cayalst (highlight)   2019-06-04 15:15:00
從C開始之後學java 現在學python輕鬆多
作者: arrenwu (鍵盤的戰鬼)   2019-06-04 15:57:00
其實1堂課18周還滿久的啦XD
作者: sarsman (DeNT15T♠)   2019-06-04 16:17:00
Code_Chat
作者: an94mod0 (an94mod0)   2019-06-04 16:40:00
現在好像戰不了Vim或Sublime了?

Links booklink

Contact Us: admin [ a t ] ucptt.com