[閒聊][幻想] 禮盒福袋程式寫法推敲
http://ppt.cc/8cz8
這是網路隨便找到的一張圖,通常帶機率的東西會用 mapping
的方式宣告
mapping box=([
"高級服飾附魔‧傷害x1" : a, // 假設開出機率 a%
"高級服飾附魔‧爆擊x1" : b, // 假設開出機率 b%
"高級服飾附魔‧堅硬x1" : c, // 假設開出機率 c%
.
.
"HP治療藥劑x3" : z, // 假設開出機率 z%
]);
冒號 : 前面是可以開出的東西,keys(box) = 這些東西的集
合;冒號後面則是機率數字,假設用直觀寫法 10 = 10%,而
random(n) 代表隨機跑出 0~n-1 之間的整數。
則有一點很明顯: a < b < c < d < ..... < y < z
而且越底下的東西越好開,越上面的東西越難開。
根據自己的 coding 經驗,我試著寫了一個 box 並模擬開一
萬次的結果如下
==========================================
高級服飾附魔‧傷害x1 : 11 組
高級服飾附魔‧爆擊x1 : 18 組
高級服飾附魔‧堅硬x1 : 50 組
服飾附魔‧傷害x1 : 76 組
服飾附魔‧爆擊x1 : 79 組
服飾附魔‧堅硬x1 : 209 組
源神能量光球(小)x3 : 186 組
幸運之證x1 : 179 組
怪物經驗書x2 : 307 組
中級尋寶護符x2 : 159 組
高級尋寶護符x1 : 151 組
璀璨的經驗秘石x3 : 206 組
源神經驗結晶(中)x3 : 2805 組
未鑑定的源神徽紀寶箱x3 : 2763 組
HP治療藥劑x3 : 2801 組
========== 程式執行區 ====================
前 20 組結果大致如下
怪物經驗書x2
HP治療藥劑x3
未鑑定的源神徽紀寶箱x3
未鑑定的源神徽紀寶箱x3
HP治療藥劑x3
服飾附魔‧爆擊x1
未鑑定的源神徽紀寶箱x3
源神經驗結晶(中)x3
未鑑定的源神徽紀寶箱x3
源神經驗結晶(中)x3
HP治療藥劑x3
未鑑定的源神徽紀寶箱x3
HP治療藥劑x3
源神經驗結晶(中)x3
未鑑定的源神徽紀寶箱x3
未鑑定的源神徽紀寶箱x3
源神經驗結晶(中)x3
未鑑定的源神徽紀寶箱x3
未鑑定的源神徽紀寶箱x3
未鑑定的源神徽紀寶箱x3
那我是怎麼設計這個 box 的呢?我將寶盒裡面 15 件物品分成
五組,每三個一組,最底下三個物品是「最好開的那一組」。
這是最直覺的想法,因為玩家開來開去,「總是開到那三個」。
其次,因為越上面的東西越難開,因此另一個直覺想法就是
for(i=0;i<15;i++)
j=j+random(2);
但通常除非運氣好到爆跑 15 次都是 0 才會累加後為 0,也就
是開出第一個,不然第一個是幾乎開不出來的。
但是這與現況不符(有人開過),而且搭配上面將物品分成五組
的想法,就變成如下
for(i=0;i<4;i++)
j=j+random(2);
j=j*3+random(4);
if(j>1) j=j-1;
上面的意思是說 j 的範圍一樣是 0~14,但是一開始是用五組
去分的,我用程式實測結果跑 10000 次約可跑出一千多次的「
開出第一組的機率」,機率是很高的。
但是再跑一次機率的話就不同了:
if(random(n)<box[keys_box[k]])
data[keys_box[k]]++;
else
{
k=12+random(3);
data[keys_box[k]]++;
}
上面的意思就是說 k 跑出 0~14 任一數字了,然後我定義了
每一組每一項物品的開出機率數字,例如第一組是 1,再用一
個 random(n) 去跑,比方說 n = 10:
if(random(10) < box[keys_box[k]])
隨機跑出 0~9 比 第一組的數字1 還小 (所以機率是 1/10)
這樣就跑出 keys_box[k] 這個東西(第一組的物品),反之,如
果隨機跑出的數字比第一組的數字 1 還大,就跑「預設讓玩家
開出的物品=最後一組任一物品」。
我寫的這種箱子的特性如下
一、越上面的東西越難開,而且是非常難開
因為是機率x機率,第一個機率是指跑出哪一組,如上所示
跑出第一組的機率差不多是 1/10 其實這機率是很不錯的,
但是「再機率的結果」就變成 1/10 x 1/10 = 1/100。
二、可是它又不是完全開不到
例如我的實測結果
高級服飾附魔‧傷害x1: 11 組 約 0.1%
高級服飾附魔‧爆擊x1: 18 組 約 0.2%
高級服飾附魔‧堅硬x1: 50 組 約 0.5%
==============================
而實際情況因為多人在買(類似簽樂透),每個人大概買個十
幾到幾十盒就能開到,因為物品只分五組、多人在買、在開
,有時人品好幾盒就能開到。
三、最底下三個東西一定是最常開到的
例如大家對總是開到源神結晶、治療藥劑這類的一定印象深
刻。
寫這個,有三個用意
一、勸世
真要拼,用招待券買一盒或少少幾盒試試手氣就好了,與其
每一期買 n 盒還不如每期買一兩盒就好,它幾乎每一期都會
出新的禮盒、寶盒等。
但基本上如果要做機關的話
if(是用招待券買的)
box->add("機率數字",-n); // 機率降低
甚至還可以跟你是否為 VIP 會員、是否在簽約網咖上網、是
否是儲值大戶、....等等掛勾。
二、隨便小小調整一個數字就能任意調整機率
這個通常最常用在農怪機率的調整上,但寶盒也是可以的,
比方它覺得怎麼才一天而已就被人開出十幾雙的翅膀背飾,
它是可以馬上調整讓玩家幾乎是開不到的。
反過來說,如果它覺得雖然才半天、禮盒銷了一兩千個了怎
麼還沒有人開到,「這樣下去可不行」,就偷偷調一下機率
,這時買到並開禮盒的人就會爽到。
所以我是覺得早買晚買、早開晚開都一樣,但是遊戲官方也
可能為了刺激消費而一開始讓機率較高,這是可能的,因為
有人開到就會貼炫耀文。
三、如果寶盒裡面垃圾放很多,這種寶盒不要買
像某仙x傳說的轉蛋通常會塞一堆料理箱子或沒啥路用的東
西,通常超過 6 個我就會說那種轉蛋不值得買。
因為複合機率運算的結果就是那六個一定是最好開的,而且
「再機率運算的結果」如果你不符合取得機率,它又會繞回
「讓你隨機取得那六個其中一個」的結果,這怎麼看都是不
划算的。
底下是部份 code,實際禮盒的程式跟下面必定相差無幾:
mapping box;
string msg="";
mixed keys_box=({});
box=([
"高級服飾附魔‧傷害x1" : 1,
"高級服飾附魔‧爆擊x1" : 1,
"高級服飾附魔‧堅硬x1" : 1,
"服飾附魔‧傷害x1" : 2,
"服飾附魔‧爆擊x1" : 2,
"服飾附魔‧堅硬x1" : 2,
"源神能量光球(小)x3" : 3,
"幸運之證x1" : 3,
"怪物經驗書x2" : 3,
"中級尋寶護符x2" : 4,
"高級尋寶護符x1" : 4,
"璀璨的經驗秘石x3" : 4,
"源神經驗結晶(中)x3" : 5,
"未鑑定的源神徽紀寶箱x3" : 5,
"HP治療藥劑x3" : 5,
]);
keys_box=keys(box);
// 跑一萬次
for(i=0;i<10000;i++)
{
k=0;
for(j=0;j<4;j++)
k=k+random(2);
k=k*3+random(4);
if(k>1) k=k-1;
if(random(15)<box[keys_box[k]])
data[keys_box[k]]++;
// 不符合機率的話一律開出最底下三個東西
else
{
k=12+random(3);
data[keys_box[k]]++;
}
}
for(i=0;i<15;i++)
msg+=sprintf("%-30s : %3d 組\n",keys_box[i],data[keys_box[i]]);
write(msg);
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.61.157.53
推
10/03 15:48, , 1F
10/03 15:48, 1F
→
10/03 15:49, , 2F
10/03 15:49, 2F
→
10/03 15:51, , 3F
10/03 15:51, 3F
推
10/03 15:51, , 4F
10/03 15:51, 4F
推
10/03 15:52, , 5F
10/03 15:52, 5F
推
10/03 15:53, , 6F
10/03 15:53, 6F
推
10/03 15:54, , 7F
10/03 15:54, 7F
推
10/03 15:56, , 8F
10/03 15:56, 8F
推
10/03 15:56, , 9F
10/03 15:56, 9F
推
10/03 15:57, , 10F
10/03 15:57, 10F
推
10/03 15:58, , 11F
10/03 15:58, 11F
→
10/03 15:59, , 12F
10/03 15:59, 12F
→
10/03 16:00, , 13F
10/03 16:00, 13F
推
10/03 16:01, , 14F
10/03 16:01, 14F
→
10/03 16:01, , 15F
10/03 16:01, 15F
→
10/03 16:02, , 16F
10/03 16:02, 16F
推
10/03 16:02, , 17F
10/03 16:02, 17F
→
10/03 16:02, , 18F
10/03 16:02, 18F
→
10/03 16:03, , 19F
10/03 16:03, 19F
→
10/03 16:03, , 20F
10/03 16:03, 20F
→
10/03 16:05, , 21F
10/03 16:05, 21F
→
10/03 16:06, , 22F
10/03 16:06, 22F
→
10/03 16:07, , 23F
10/03 16:07, 23F
→
10/03 16:08, , 24F
10/03 16:08, 24F
→
10/03 16:14, , 25F
10/03 16:14, 25F
→
10/03 16:17, , 26F
10/03 16:17, 26F
→
10/03 16:18, , 27F
10/03 16:18, 27F
→
10/03 16:19, , 28F
10/03 16:19, 28F
→
10/03 16:20, , 29F
10/03 16:20, 29F
推
10/03 16:28, , 30F
10/03 16:28, 30F
→
10/03 16:32, , 31F
10/03 16:32, 31F
→
10/03 16:33, , 32F
10/03 16:33, 32F
推
10/03 16:33, , 33F
10/03 16:33, 33F
→
10/03 16:34, , 34F
10/03 16:34, 34F
→
10/03 16:34, , 35F
10/03 16:34, 35F
→
10/03 16:34, , 36F
10/03 16:34, 36F
→
10/03 16:35, , 37F
10/03 16:35, 37F
→
10/03 16:36, , 38F
10/03 16:36, 38F
推
10/03 16:41, , 39F
10/03 16:41, 39F
→
10/03 16:43, , 40F
10/03 16:43, 40F
→
10/03 16:44, , 41F
10/03 16:44, 41F
→
10/03 16:44, , 42F
10/03 16:44, 42F
→
10/03 16:46, , 43F
10/03 16:46, 43F
一般來說有三種做法
1.加法堆疊: 機率直覺累加
比方 (100% + 3% + 4% + 5%) = 112%
2.乘法堆疊: 機率累乘, 可控制在一定範圍
比方 100% x (100+3)% x (100+4)% + (100+5)% = 112.476%
3.混合堆疊: 比方為區別不同的效果(通常累乘優於累加)
比方 (100% + 3% + 4%) x (100 + 5%) = 112.35%
→
10/03 16:47, , 44F
10/03 16:47, 44F
推
10/03 16:48, , 45F
10/03 16:48, 45F
※ 編輯: laechan 來自: 210.61.157.53 (10/03 16:58)
→
10/03 16:53, , 46F
10/03 16:53, 46F
→
10/03 16:59, , 47F
10/03 16:59, 47F
→
10/03 17:00, , 48F
10/03 17:00, 48F
→
10/03 17:01, , 49F
10/03 17:01, 49F
以 RO 為例,假設某怪 LOOT = ([
"a物品": 30%,
"b物品": 10%,
"c物品": 1%,
]);
keys_loot = keys(LOOT);
j = sizeof(keys_loot);
k = 0;
for(i=0;i<j;i++)
{
if(random(100)<LOOT[keys_loot[i]])
{
掉落該物品;
k=k+1;
if(k >= 一定數量)
break; // 跳出迴圈
}
}
這是最簡單的寫法,打怪通常一次掉一個東西的話,就是只要
掉落物品就立刻 break; 跳出迴圈。
這樣它所公布的機率(就是RO各大攻略網站可看到的)就確實是
物品的實際掉落機率,因為每一物品的掉落是獨立的。
但是寶盒、禮盒、福袋、轉蛋絕對不會這樣寫,因為這是官方
要拿來賺錢的,設定絕對不會如此單純。
※ 編輯: laechan 來自: 210.61.157.53 (10/03 17:06)
→
10/03 17:19, , 50F
10/03 17:19, 50F
→
10/03 17:19, , 51F
10/03 17:19, 51F
推
10/03 17:49, , 52F
10/03 17:49, 52F
推
10/03 17:51, , 53F
10/03 17:51, 53F
推
10/03 17:58, , 54F
10/03 17:58, 54F
推
10/03 18:58, , 55F
10/03 18:58, 55F
推
10/03 19:14, , 56F
10/03 19:14, 56F
→
10/03 21:23, , 57F
10/03 21:23, 57F
推
10/03 21:58, , 58F
10/03 21:58, 58F
推
10/03 22:59, , 59F
10/03 22:59, 59F
→
10/03 22:59, , 60F
10/03 22:59, 60F
→
10/03 23:00, , 61F
10/03 23:00, 61F
推
10/04 01:31, , 62F
10/04 01:31, 62F
推
10/04 10:00, , 63F
10/04 10:00, 63F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
24
63
X-Legend 近期熱門文章
PTT遊戲區 即時熱門文章
-9
30
-65
138
34
86
46
153
28
65
14
45