精華區beta C_Chat 關於我們 聯絡資訊
※ 引述《NoNameL (無名L)》之銘言: : → arrenwu: 差就只差在是不是有什麼東西會不會跟時間有關 : → arrenwu: 如果內部機制跟時間無關,你啥小策略都沒差 欸... 針對這點,我有個不同的想法...,先說結論: 正因為相信遊戲的隨機是用 random(), 所以,我是友抽派,先拿友情抽試水溫, 如果連 3-40 抽摃龜時,才會去抽大的。 各家用的亂數引擎不盡相同,但原理是差不多的, 有興趣瞭解 random 原理的同學可以參考這裡~ https://msdn.microsoft.com/zh-tw/library/system.random(v=vs.110).aspx 基於推廣 LoveLive! 的私心,以下舉例都用 LLSIF 為背景。 以 UR 卡機率 1% 來說,我認為機率部份的程式大致如下: r = rand() % 100 // 0~99 隨機產生一個數字 如果是 0,就給你 UR,如果是其他的數字,就給你其他的卡片。 友情抽呢?假設 R 卡機率為 5%,隨機出數字 0~4 給你 R,其他則是給你 N。 rand() 可想成一個隨機序列,把 scale 拉大來看,假設100萬次好了, 理想上就是 0~99 每個數字各出現1萬次。 我先用友抽抽掉30張廢卡,接下來的99萬9仟9佰70次抽卡裡,中UR的機率就提高了。 這跟同時間有沒有人在跟我一起抽,或者有沒有人插隊都沒關係, 總之我就是把接下來序列裡的30次大數字跳過了。 這個作法,唯一的風險,就是寫抽卡那個 RD 吃飽了太閒, UR 用 0 來出卡,R 用 95~99 出卡。 以一個腦子正常的工程師來講是不會這樣做的。 用這個方式,我在 UR 20%/ SR 80% 的歐洲抽之中,  第二次就抽中了 UR,原本應該是五抽會中一抽的,但我只用兩抽就收工了!  是不是很有用?給大家做參考~ ^^"  不過後來又抽了三次都是 SR,回歸到 1/5 了... 機率真穩 ._. -- 喜歡拍照的正妹們,趕快來找我報到吧!!! https://flic.kr/s/aHsk8JbB2C -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.30.252 ※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1511772616.A.642.html
emptie: 多想了吧 你抽好幾次是不是在同一個thread上執行都不知道 11/27 16:52
這跟 thread 無關,一個程式的亂數引擎照理只會被 init 一次, init 兩次以上會產生非常多可能的問題,一個合格的工程師通常不會這樣搞
tonyxfg: 友情抽是什麼意思? 11/27 16:52
emptie: 而且他也可以寫0-999999 然後0-9999出UR啊 11/27 16:53
當然可以呀,但結果是一樣的,先用友情抽把 10000-999999 的數字篩掉一些, 有機會微幅地增加近期序列裡大獎的密度
arrenwu: 友情抽那邊可以更詳細說明嗎? 看不懂什麼是友情抽@@" 11/27 16:53
wolver: 那是人工讓大數據機率趨近於 亂數 但對單一個人來說 11/27 16:54
wolver: 那種絕對不是亂數,才會有歐洲人非洲人差別 11/27 16:54
wolver: 也就是某個人抽很多好卡,就會有倒楣鬼一直抽爛卡 11/27 16:55
kashiwa27: 友情抽就是很多手遊都有的免費垃圾抽 11/27 16:55
anumber: 友情點就是大部分遊戲不能課金拿到的資源啦 11/27 16:55
tonyxfg: 原來是這意思XD 11/27 16:55
s2637726: 又是賭徒 11/27 16:56
ming1053: 你沒考慮過分散式情況 可能不只一個worker在處理抽卡 11/27 16:56
有可能,但這無損於友抽的策略 如果我命不好,友抽抽完被丟去另一個伺服器,那也不過就是回到原點, 跟一般的玩家一樣而已,但若是剛好在同個伺服器被服務到,不就有點用了 ^^?
tonyxfg: 可是這樣也不對啊,照原po的說法會變成卡片總數固定,抽 11/27 16:56
wolver: 單一個體跟所有個體總和後的數據 這就是差別 11/27 16:57
tonyxfg: 完不放回,但一般不太可能會這樣做吧?這樣只要準備足夠 11/27 16:57
tonyxfg: 多的錢就能把卡池抽光光? 11/27 16:57
不是的,隨機函式並不是一個池,而是一個無窮的列序,用一個簡單的例子來說, 假設這個函數是這樣設計的 f(0) = 3, f(n + 1) = f(n) * 7 mod 17 // mod 是取餘數的意思 這時,f(1) = 4, f(2) = 11, f(3) = 9, f(4) = 12, ... 序列是 3, 4, 11, 9, 12, ... 一直下去,要多少都有,無限的 但亂數引擎在設計時,會希望序列長度夠大時,各個數字出現的次數差不多, 而且希望能均勻,不管是產生1萬次或100萬次。 既然如此,如果最近才剛出現過某些數字, 在很短的時間又重覆出現的機率,相對就低了
wolver: 因為電腦根本不懂啥是亂數 隨機 它的硬體就是這樣 11/27 16:57
arrenwu: 戰女裡面有類似友情抽的機制嗎? 11/27 16:58
Rain0224: 沒有吧 @@ 11/27 16:59
CCapocalypse: 這招有效怎麼會有倒霉鬼? 真正的酋長怎樣做出來的 11/27 17:01
CCapocalypse: 就是r卡 11/27 17:01
你完全搞錯了機率的用法,1% 的UR,抽不中的機率是 0.99 連續1000抽不中是 (0.99)^1000 ~= 萬分之四, 一萬個人裡面有4個人連續1000抽槓龜是很自然的事,接受他,放下他
wolver: 現實就是沒辦法做到單一玩家,自己有單一獨立的數據亂數 11/27 17:03
wolver: 所以爐石或那些卡牌遊戲才會有防臉黑機制 11/27 17:03
OAzenO: 是的 探究到底就是電腦做不到真隨機 11/27 17:04
wolver: 幫那堆可憐的地獄倒楣鬼.至於歐洲人還是一樣歐洲 11/27 17:04
wolver: 所以前面確認你是非洲人還是歐洲人 再決定要不要玩 11/27 17:06
krousxchen: 問題在於你確定隨機是在你本機執行的嗎?? 11/27 17:06
wolver: 非洲人還要玩 那你就是要變成石油王. 否則跳比較快 11/27 17:06
krousxchen: 如果都是在伺服器執行的,你那些友抽馬上被其他人洗掉 11/27 17:07
這無所謂,就算別人立刻抽掉1000張好了 從我開始抽的那個瞬間,往後看100萬張,這序列仍然少了我友抽跳掉的那30張 要看的不是近期的幾十張,機率不是這樣用的,要用很巨觀的角度來看
shintrain: 抽籤放回跟抽籤不放回的機率是一樣的 11/27 17:07
抽籤是這樣,但是程式語言的 random 不是抽籤
shifa: 簡單說只要抓出歐洲人,其他人就是非洲人?我好像懂了什麼 11/27 17:07
shifa: XD 11/27 17:07
wolver: 不太可能在本機 這樣很容易作弊. 11/27 17:08
shintrain: 所以你說先抽一些爛卡讓好卡的機率增加是錯的 11/27 17:08
guogu: 並不會 通常不是一個數列在取 他是用時間當種子在取 11/27 17:08
krousxchen: 而事實上,我遇過抽卡突然閃退,重開抽到的東西還在 11/27 17:08
guogu: 用時間當種子在取的話那跟你前面抽幾次一點關係都沒用 11/27 17:09
krousxchen: 所以抽卡絕對是在伺服執行的 11/27 17:09
wolver: 而且通常為了不讓SERVER負擔太大 很有可能還是先抽好 11/27 17:10
wolver: 然後USER抽的時候直接派抽好的結果給你 11/27 17:10
我從來沒說過是在本機抽,這絕對都是在 server 上抽, 而且,只要用了 random(),這跟直接派抽好結果的意義是一樣的, 跟我論述不但沒相抵觸,反而完全符合。 先抽好的結果我也相信他就是簡單用一個 random 去產生的,數列的性質是一樣, 當數量很大的時候,各個隨機數字的分佈是均勻的, 於是,當你在某個時間點抽掉了特定大的數字,接下來幾佰萬次的序列中, 存在大數字的比例就稍微降低了
krousxchen: 但如果別人那一千抽都是法老上身?? 11/27 17:16
結果是一樣的,一樣用100萬抽來看,1萬抽是UR,有法老瞬間抽掉1000張UR, 如果我沒先抽掉30張N卡,我面對的序列是 9000張UR + 99萬張其他 如果我先抽掉30張N卡,那我面對的序列是 9000張UR + (99萬-30)張其他 仍然是先濾掉一些N卡來得有利~~ 不論我怎麼做,都無法阻止別人抽卡,其他人的行為對我而言也都是隨機的, 用機率來看這件事,就不需要去想這種特例。
lay10521: 獨立事件 11/27 17:19
獨立事件只存在於紙上,程式的運作沒那麼完美
howardjou: 可是你ㄧ台抽的數字在其它幾萬台面前可能被洗光了 11/27 17:23
krousxchen: 你高興就好,因為一百萬分之30是很接近零的 11/27 17:26
很接近零,但不是零,反正友情抽都是要用掉的,何不拿來增加點可能性?
hsiehfat: 問題是友抽的池和石抽的池根本不一樣啊... 11/27 17:27
hsiehfat: 你為什麼覺得抽掉友抽就能影響石抽的結果? 11/27 17:27
hsiehfat: 有些卡友抽抽不到,有些卡石抽抽不到 11/27 17:28
hsiehfat: 所以終歸還是回到一句話:玩家根本無法得知伺服器端 11/27 17:28
hsiehfat: 是怎麼實做隨機這件事情 11/27 17:28
的確,除非給我看 code,不然沒辦法驗證, 不過,程式寫久了,自然會對實作的方法有感覺。 抽個卡而已,最簡單就是用 random,如果覺得效果不好, 也是透過保底或者是累積幸運值的方式去補比較實在, 要做好亂數引擎是一門大學問,也不該是 app 工程師該花時間去做的事, 所以,預設程式端是個簡單的 random 是很合理的想法。(剃刀原理
gn00399745: 你這篇的結論前提很多 11/27 17:28
gn00399745: 一個平均分布的樣本 你如何sample 他都還是平均的 11/27 17:30
gn00399745: 另外你可以去查一下memoryless property 11/27 17:31
arrenwu: "序列長度夠大時各數字出現的次數差不多" 這隨機就行了 11/27 17:33
arrenwu: Law of Large number 會保證你講的那件事情 11/27 17:34
jimmy689: 你覺得每次處理你抽獎請求的服務器都是同一臺? 11/27 17:36
的確,這沒辦法保證呢... 不過,在那麼多的未知之下, 要抽卡之前先把友情抽抽掉,也沒壞處,不是嗎? 搞不好他們的系統跟我想的一樣呀~,審慎樂觀 ^^"
hardyuse: 之前才有某遊戲抽卡動手腳的新聞 你還相信random實作? 11/27 17:39
當然相信呀,不然怎麼會去玩呢? 都已經不相信遊戲公司了,還去玩人家的抽卡遊戲,這也太奇怪了吧...
hardyuse: 整篇看下來我只覺得你在自high 很多細節不知道你是裝作 11/27 17:41
hardyuse: 沒看到還是真的沒看到 11/27 17:42
舉個例子?
bowcar: 看一下 這作法就當偏方吧 反正友情點放著也沒用 11/27 17:48
bowcar: 我是懂原PO想表達的意思啦,不過就像推文說的這前提很多 11/27 17:49
bowcar: 就寧可信其有吧XD 11/27 17:49
hollowland: 一般來講 友情抽的random範圍應該跟課金抽依樣 11/27 17:50
hollowland: 你這前提是友抽的範圍=課金的廢卡範圍 11/27 17:51
hollowland: 我想不出來有什麼理由要這樣幹 比起特別縮小友抽範圍 11/27 17:52
hardyuse: 我說的嚴重了,不過我建議你不要對遊戲公司抱太大期望 11/27 17:52
hollowland: 直接給友抽另一個table不是比較乾脆 11/27 17:52
以實作的角度,我覺得第一階段先 random 出卡級是很理所當然的。 因為遊戲的公告裡是這麼寫的,UR 1%/SSR 4%/SR 15%/R 80% 各級卡片裡張數不一,要如何能確保結果各級卡片的產出符合公告? 最直覺的做法,就是先骰稀有度,然後再決定到底是該星級裡的哪張卡片 他先用一個 random 骰了級數,接著用第二個 random 決定卡面。 友抽可以是另一個 table,但他也一樣是用兩個 random 來骰出一張卡。 只要用到了 random,就是同個序列了 當然,他絕對可以把機制弄得更複雜,但隨機的結果人類來看都差不多, 用最簡單直覺的作法是比較有可能的... :)
hardyuse: 你覺得不妥我第二和第三行推文可以刪除沒關係 11/27 17:53
呃... 大家交換意見而已,沒這麼嚴重 ( ̄□ ̄|||)a ※ 編輯: archon (125.227.30.252), 11/27/2017 18:02:27
Xavy: 抽卡玄學自己信就好,不用說給人聽 11/27 18:19
saulong: 我建議你寫個程式下去跑結果 證明有效即可 11/27 18:30
hardyuse: saulong +1 我也建議你跑程式證明你的理論 11/27 18:32
有這麼難嗎?剛才我跑了第一次,10000 抽中 UR 中了 105 張(>1%, 有興趣的人可以自己安裝 python 環境多玩幾次,跑到100萬抽應該要花點時間 import random def friendPick(): for i in range(1, 30): r = random.randint(1, 100) if r <= 5: # hit R return True return False def main(): cntLovecaPick = 0 cntUR = 0 while cntLovecaPick < 10000: if friendPick(): continue r = random.randint(1, 100) if r == 1: # hit cntUR = cntUR + 1 cntLovecaPick = cntLovecaPick + 1 print(cntLovecaPick, cntUR) print(cntUR) if __name__ == '__main__': main()
dodomilk: 糟糕你講得好像有點道理,不過如果沒有足夠次數驗證我是 11/27 18:40
dodomilk: 不會信的......有些噓文的可能不了解程式的運作方式 11/27 18:41
※ 編輯: archon (125.227.30.252), 11/27/2017 18:47:04
shinchen: 你怎麼知道友抽跟石抽都是用數字小的當作中獎? 如果設計 11/27 18:48
shinchen: 石抽0中獎 友抽95~99中獎 照你的理論不就反過來了 11/27 18:48
R0bin03: 用程式觀念試著解釋而已也要被說是玄學… 11/27 18:48
R0bin03: 用程式觀念試著解釋而已也要被說是玄學… 11/27 18:49
R0bin03: 重複推到抱歉 11/27 18:49
dodomilk: @shinchen 原PO自己有提到,一般工程師不會這樣折磨自己 11/27 18:52
dodomilk: 要證明的話就分兩組,一組直接投石抽,一組先抽友抽連續 11/27 18:54
dodomilk: 30次二星以下,再抽石抽。看兩者石抽四五星機率有沒有差 11/27 18:55
dodomilk: 不過我猜可能要抽個幾百次才能達到p<0.05 11/27 18:56
nomorethings: 友情抽增加機率我也是笑笑的,這種感覺文又沒有足 11/27 18:57
nomorethings: 夠數據證明,那麼厲害怎麼不做個統計來證明你的理 11/27 18:57
nomorethings: 論咧? 11/27 18:57
shinchen: 改個數字也叫折磨自己 當工程師是猴子嗎... 11/27 18:57
shinchen: 你不知道伺服端程式怎麼寫的 分析這些就是玄學沒錯啊 11/27 18:58
guogu: 1w抽1%隨便都能跑出105以上好嘛w別搞笑了 11/27 19:10
guogu: 不信你直接寫寫看1w抽1%試試看 11/27 19:10
hollowland: 你的前提是友抽要先必骰到普卡 然後才骰那張卡 11/27 19:12
Xavy: 還真的有人被唬得一愣一愣的耶 11/27 19:12
hollowland: 我寫友抽直接骰什麼卡 你這個假設不就gg了 11/27 19:14
harryron9: 10000抽1% 抽成1.05%算是顯著提升...嗯... 11/27 19:15
noob9527: 阿這不就是賭徒謬誤嗎... 11/27 19:15
yukitowu: 畢竟不會跳例外的BUG很難除錯啊www 11/27 19:15
hollowland: 別人友抽直接抽那張卡 不就gg了 11/27 19:15
unsocial: 友情抽跟寶石抽怎麼會在一個池? 11/27 19:16
guogu: https://i.imgur.com/fXg94Dt.png 11/27 19:19
guogu: 老人學不會新把戲也不是讀資工的就通融我VB隨便寫吧 11/27 19:20
hollowland: 我看一下這個程式碼… 我很懷疑你繼續跑個幾十次會得 11/27 19:20
hollowland: 出可以提升抽卡率的結果 11/27 19:20
noob9527: 照你說的rand()%10 我9抽沒出0 第10抽中0機率有100%呢 11/27 19:22
noob9527: 這種又沒說抽完後獎項就再也抽不到 所以前題就錯了 11/27 19:26
hollowland: rand()不是整數所以沒這個問題… 11/27 19:27
hollowland: 上面g大程式示範了直接抽1%抽到1.12% xd 11/27 19:29
NoNameL: g大那隻程式是這樣沒錯啊,但這隻程式是「有機率」會掉 11/27 19:38
NoNameL: 進無窮迴圈出不來的。那些就是「被吃掉」的小於1%的機率 11/27 19:39
shinchen: guogu的程式是固定抽10000次 你是不是看錯迴圈變數...? 11/27 19:41
shinchen: 會盡無窮迴圈是一直抽到中100個才停下來看次數那種 11/27 19:41
hollowland: 掉進無窮迴圈程式就當掉了耶... 11/27 19:42
NoNameL: 啊,對,我看錯了。 11/27 19:46
kamisun: 戰女很少大爆死,但我遇過幾次,最嚴重的是去年萬聖節 11/27 19:53
kamisun: 抽快40把四星武器,才來想要的 11/27 19:54
guogu: 我是用雙浮點去接rnd 理論上來說他是產生0~1的數字 11/27 19:56
guogu: 印象中是小數以下7位吧? 如果沒加等號大概千萬分之一會爆破 11/27 19:58
yuyuyuai: 怎可能這樣讓你搞 友抽和石抽不太可能會寫在一起吧 11/27 20:00
gn00399745: 每次run random用的seed應該不太一樣吧 11/27 20:01
gn00399745: 事實上seed在亂數序列的位置應該會一直跳 11/27 20:01
gn00399745: 你亂數序列概念對 但是你要考慮到seed吧 11/27 20:02
gn00399745: 用seed產生亂數 你只要SEED變動 他結果就是和之前抽 11/27 20:03
gn00399745: 無關 甚至seed可能會跳回你友抽用的爛seed 11/27 20:04
yuyuyuai: 對 樓上這也是一種反駁的論點 只是最近才被龍珠手遊的廢 11/27 20:04
yuyuyuai: 物工程師打臉QQ 11/27 20:04
gn00399745: 亂數在程式裡的確是一個大數表單 但是她會循環 11/27 20:07
gn00399745: 而且還可以利用多個大數表單交配產生更大的表單 11/27 20:09
greydust: 呃你的推論是沒錯 但通常亂數序列至少也是2的31次方減1 11/28 00:50
greydust: 也就是21億多 就算你先抽掉100個大數字也才增加2100萬分 11/28 00:50
greydust: 之1的機率.. 11/28 00:50
greydust: 還要考慮到序列重置和序列遠大於2147483647的可能性 基 11/28 00:50
greydust: 本上這個方法等於沒有用 11/28 00:50
benny30912: 二項分配的標準差是sqrt(np(1-p)),差不到一個標準差 11/28 06:32
benny30912: 根本沒有統計上的差異 11/28 06:32
WrongHole: 11/29 07:02