作者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://webptt.com/cn.aspx?n=bbs/java/M.1421738021.A.CBD.html
1F:→ cowbaying: 机率并不表示一定会发生的次数... 01/20 18:03
2F:→ cowbaying: 就算是1/2的机率 也有可能永远落在不中那边 01/20 18:03
3F:→ ssccg: 那是因为人对机率有不自然的倾向,会有一直没中接下来更容 01/20 20:18
4F:→ ssccg: 易中的错觉(其实下次机率还是不会变) 01/20 20:20
5F:→ ssccg: 真的调整成人感觉的随机,那就不是随机了 01/20 20:21
6F:推 cyclone350: 英雄联盟的爆击率好像就是这麽做的 01/20 20:31
7F:→ cyclone350: 其实我觉得决策做好後要怎麽写都不会太困难 01/20 20:32
8F:→ cyclone350: 要真随机还是假随机决定好後就可以做了,前篇推文只是 01/20 20:37
9F:→ cyclone350: 抱怨一下工作状况 XD 01/20 20:37
10F:推 taco0827: 嗯...在业界当营运多年,一般是三种作法 01/20 20:57
11F:→ taco0827: 1.放任纯机率 2.加上杠龟次数後必中 3.逐渐提升命中机率 01/20 20:58
12F:→ Killercat: 1 2楼,你知我知天知地知,可惜老板顾客不知啊 XD 01/21 11:40