看板 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.
l22573729: 我也是從c開始學1F 06/04 11:20
hedgehogs: 快推免得被說看不懂2F 06/04 11:23
kaj1983: 我是從QB開始學...3F 06/04 11:24
aleezible: 喔喔,對對對,跟我想得差不多4F 06/04 11:24
jackwula9211: 我那時候大家都學C++啊,其實還是滿好用的啦5F 06/04 11:25
aikotoba: 其實我也是這麼想的6F 06/04 11:26
arrenwu: 其實我覺得第一個學C挺怪的就是7F 06/04 11:29
js850604: 完了我只用過MATLAB8F 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
roger840410: 我之前大學資工三個班 其他兩班學c++我們學c16F 06/04 11:36
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
twosheep0603: 先學c/c++可以方便銜接計算機概論的硬體知識27F 06/04 11:42
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
CorkiN: 神比喻49F 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


forsakesheep: 這篇給我的感想就是程式設計師=魔法師56F 06/04 11:51
見習魔法師報到


arrenwu: 一個很大的不同是,C++的魔法放久了會對你精神造成負擔,57F 06/04 11:51
rofellosx: 換硬體比較快+158F 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
rofellosx: c跳c++只會混亂吧..67F 06/04 11:55
arrenwu: 是不習慣標準函式庫太強太威猛嗎XD68F 06/04 11:55
CorkiN: 這串釣到一堆神人==69F 06/04 11:56
Giornno: c接c++不習慣你是開玩笑,同一個媽生的程式語言70F 06/04 11:56

fragmentwing: 對了感謝鼓勵71F 06/04 11:57
我一直認為學程式就是為了用程式解決生活上的問題
為了解決問題而去學習程式,就能維持對寫程式的興趣
如果這份熱情可以一直延續到成為工作,那就更棒了


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
jonathan793: c++跟c差很多好嗎? 你才在開玩笑78F 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
Ikaros1110: c到c++直接回不去88F 06/04 12:01
arrenwu: 我倒是從來沒學過Fortran 這語言現在很多人用嗎?
goto在非底層語言上算是一種忌諱了吧XD89F 06/04 12:01
rofellosx: C跳C++會混亂是 你會下意識用C的概念去學  問題是物件91F 06/04 12:02

xdavidchen1: c_chat(X) C++chat(O)92F 06/04 12:03
其實也是C Chat(?)


rofellosx: 完全是另一個世界  很多C的概念根本不適用 加上語法像93F 06/04 12:03
devilkool: fortran有的老傳產還在用94F 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

--
--
(seeghost945.): Re: [閒聊] 1%的抽卡率抽100次機率是63.4%? - ACG板