作者Killercat (殺人貓™)
看板java
標題Re: [問題] 想做 bias 的 random number generator
時間Tue Jan 20 15:13:38 2015
※ 引述《RSAES (RR)》之銘言:
其實推文有人提到「老闆的想法」,這個在遊戲界還挺常見的
尤其是博弈遊戲
我舉個粗略一點的例子(事實上他們用的手法精細的多)
我們假設有一個東西中獎率是1/4 但是我們不能用純亂數
因為你用亂數表去跑
Random random = new Random();
if(random.nextInt() % 4 == 0) Jackpot();
你會發現雖然宏觀來講是極接近1/4是沒錯的,但是跑亂數表下去就知道
你會常常看到10個 20個沒中獎的,而且並不算少見
我隨手跑一個例子給你看
https://gist.github.com/Rayer/558e1e97df70d59b12d3
我隨便跑一次,出來的結果是
XXXXOXXXXXXXXXXXXXXXOXOXXXOXXOXXXXOXXOXXOOXXXXXXOX
XXXXOXXXXXOXOXXXOXXOXXXXOXXXXOOOOXXXXOXXOXOXXOXXXO
O是中獎(1/4) X是沒中獎(3/4)
O剛好25(中獎率1/4)次,說真的算滿少見的 XD
我完全沒有更改任何結果喔 純粹是跑了兩次,選一次看起來聳動點的而已
看到第六次開始那長串X嗎?在遊戲裡面人有一種傾向就是會記憶壞運忘記好運
即使後面還有四連hit,都是沒有用的,他們心裡面就會認定,幹,這營運奸商
這想法就是典型你提到的老闆的想法
所以為了避免這種情形,我們會跑一個buffer讓這種情況最多連續n次沒中
而假設中獎率是1/m 那 n = 1.5*m 也就是中獎率
但是這個「必中」也不能白白送她,我們會從後面扣回來
扣回來的方法很多種,不過比較常見的就是從連續中獎下手,把本來中獎改成沒中
直到把前面「本來沒中,但是因為當次必中」的buffer扣光為止
這樣看起來就會平均一點了(上班中 想到再補實作 實作其實滿簡單的)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.124.251.135
※ 文章網址: https://www.ptt.cc/bbs/java/M.1421738021.A.CBD.html
→ cowbaying: 機率並不表示一定會發生的次數... 01/20 18:03
→ cowbaying: 就算是1/2的機率 也有可能永遠落在不中那邊 01/20 18:03
→ ssccg: 那是因為人對機率有不自然的傾向,會有一直沒中接下來更容 01/20 20:18
→ ssccg: 易中的錯覺(其實下次機率還是不會變) 01/20 20:20
→ ssccg: 真的調整成人感覺的隨機,那就不是隨機了 01/20 20:21
推 cyclone350: 英雄聯盟的爆擊率好像就是這麼做的 01/20 20:31
→ cyclone350: 其實我覺得決策做好後要怎麼寫都不會太困難 01/20 20:32
→ cyclone350: 要真隨機還是假隨機決定好後就可以做了,前篇推文只是 01/20 20:37
→ cyclone350: 抱怨一下工作狀況 XD 01/20 20:37
推 taco0827: 嗯...在業界當營運多年,一般是三種作法 01/20 20:57
→ taco0827: 1.放任純機率 2.加上槓龜次數後必中 3.逐漸提升命中機率 01/20 20:58
→ Killercat: 1 2樓,你知我知天知地知,可惜老闆顧客不知啊 XD 01/21 11:40