5 个版本 (3 个破坏性更新)

0.4.0 2022 年 7 月 1 日
0.3.1 2022 年 2 月 8 日
0.3.0 2022 年 2 月 4 日
0.2.0 2022 年 1 月 3 日
0.1.0 2021 年 12 月 29 日

#1637解析实现

每月 26 次下载

MIT/Apache

75KB
1.5K SLoC

Gcalc

Gcalc 是一个游戏概率计算器。

Gcalc 不是一个抽卡模拟器,而是一个通用的概率计算器。因此,gcalc 的目标不是从给定的尝试次数中获得百分比,而是计算“尝试”的预期效果。这种预期可以用来决定应该给用户多少尝试次数,评估游戏事件可能产生的经济影响等等。

变更

用法

# Basic
gcalc <SUBCOMMAND> <OPTIONS>

# SUBCOMMANDS:
#   cond         Conditional calculation
#   qual         Conditional calculation but only prints result
#   range        Prints range of calculations
#   reference    Create a reference file
#   option       Create an option file

# For cond and qual
-b, --budget <budget>          Budget of total cost
-C, --cost <cost>              Cost per try

# For range
-c, --count <count>            Counts to execute
-S, --start <start>            Starting index to print

# Global option
    --constant <constant>      Constant value to be added into probability
-f, --format <format>          Table format(csv|console|gfm)
    --fallback <fallback>      Set csv value fallback {rollback|ignore|none} [default: none]
-h, --help                     Print help information
-l, --column <column>          Column mapping
    --noheader                 CSV without header
-o, --out <FILE>               File to write output
-O, --option <option>          Option file to use
-p, --probability <prob>       Basic probability
    --value <value>            Target goal's value
-P, --precision <precision>    Precision
-r, --ref <reference>          Reference file
    --refin                    Reference from stdin
-s, --strict                   Set strict CSV reader mode, every try should be corresponding csv record.
-t, --target <target>          Target probability to achieve
-T, --type <probtype>          Probability type(percentage|fraction)
    --plot                     Create plot vector graphics named as "out.svg"

安装

二进制

cargo install gcalc --features binary --locked

[dependencies]
gcalc = "*"

演示

# Print records of probability 0.2(20%) with budget of 100 and cost of 20 for each iteration.
# Target probability is 0.6
gcalc cond --probability 0.2 --budget 100 --cost 20 -f console --precision 2 -T percentage -t 0.6

# Print from 0 to 10 as github markdown formatted table, which has a precision of
# 2 digits. Each try has cost of 1000.
gcalc range --probability 0.2 --count 10 --format gfm --precision 2 --cost 1000

# Print probability changes illustrated as csv formatted table, which has a
# precision of 2 digits. Target probability is 0.8.
gcalc cond --probability 0.2 --format csv --precision 2 --target 0.8

# Print how many counts are required to reach 0.99 probability with 0.01 change of each try
# Qual subcommand uses geometric-series formula if no reference was given as an argument
# Which is efficient for very small probability cases
gcalc qual --probability 0.001 -f gfm --target 0.99 --precision 2

# Use reference file 
gcalc <SUBCOMMAND> --ref ref.csv

# Use reference from stdin
cat ref.csv | gcalc <SUBCOMMAND> --refin

# Read options from option file
gcalc range --option option.json

先前使用的成果是,

# gcalc cond --probability 0.2 --budget 100 --cost 20 -f console --precision 2 -T percentage -t 0.6
+-------+-------------+------+----------+-------+
| count | probability | cost | constant | value |
+-------+-------------+------+----------+-------+
|   1   |   20.00%    |  20  |    0     |   0   |
+-------+-------------+------+----------+-------+
|   2   |   36.00%    |  40  |    0     |   0   |
+-------+-------------+------+----------+-------+
|   3   |   48.80%    |  60  |    0     |   0   |
+-------+-------------+------+----------+-------+
|   4   |   59.04%    |  80  |    0     |   0   |
+-------+-------------+------+----------+-------+
|   5   |   67.23%    | 100  |    0     |   0   |
+-------+-------------+------+----------+-------+

# gcalc range --probability 0.2 --count 10 --format gfm --precision 2 --cost 1000
| count | probability | cost  | constant | value |
|-------+-------------+-------+----------+-------|
|   1   |    0.20     | 1000  |    0     |   0   |
|   2   |    0.36     | 2000  |    0     |   0   |
|   3   |    0.48     | 3000  |    0     |   0   |
|   4   |    0.59     | 4000  |    0     |   0   |
|   5   |    0.67     | 5000  |    0     |   0   |
|   6   |    0.73     | 6000  |    0     |   0   |
|   7   |    0.79     | 7000  |    0     |   0   |
|   8   |    0.83     | 8000  |    0     |   0   |
|   9   |    0.86     | 9000  |    0     |   0   |
|  10   |    0.89     | 10000 |    0     |   0   |

# gcalc cond --probability 0.2 --format csv --precision 2 --target 0.8
count,probability,cost,constant,value
1,0.20,0,0,0
2,0.36,0,0,0
3,0.48,0,0,0
4,0.59,0,0,0
5,0.67,0,0,0
6,0.73,0,0,0
7,0.79,0,0,0
8,0.83,0,0,0

# gcalc qual --probability 0.001 -f gfm --target 0.99 --precision 2
| count | probability | cost | value |
|-------+-------------+------+-------|
| 4602  |    0.99     |  0   |   0   |

参考文件示例

count,probability,constant,cost
1,0.1,0,50
2,0.2,0,40
3,0.3,0,30
4,0.4,0,20
5,0.5,0,10

选项文件示例

{
	"count": 10,
	"prob_type": "Percentage",
	"prob_precision": 2,
	"budget": null,
	"fallback": "None",
	"no_header": false,
	"strict": false,
	"target": null,
	"value": null,
	"format": "GFM",
	"csv_ref": {
		"File": "ref.csv"
	},
	"out_option": "Console"
}

"csv_ref" 是一个包含变体的元组...

"csv_ref" : {
	"Raw" : "count,probability,constant,cost
1,0.1,0.0,10"
}

or

"csv_ref" : {
	"File": "file_name_in_string"
}

or

"csv_ref" : "None",

高级用法

列映射

您可以通过列映射读取现有的 csv 文件,而无需更改原始列的名称。

查询的列是

  • 计数
  • 概率
  • 成本
  • 常数
# Example csv content...
db,type,count,const,cost,probability
t1,a,1,0.1,30,0.1
t1,b,2,0.1,20,0.1
t1,c,3,0.1,10,0.1
t1,a,4,0.2,30,0.1
t1,b,5,0.2,20,0.2
t1,c,6,0.2,10,0.3

# Example usage
gcalc range --ref ref.csv  --count 6 --column prob=probability,constant=const

严格读取

默认情况下,Gcalc 不会匹配每个尝试与对应参考记录。

# Example csv file
count,probability,constant,cost
1,0.5,0,50
2,0.2,0,40
3,0.3,0,30
4,0.4,0,20
5,0.5,0,10

# Range from 1 to 10
# From 6th try, 5th record values are used
gcalc range --count 10 --ref ref.csv 

用户可以通过 strict 标志禁用此行为

gcalc range --count 10 --ref ref.csv --strict

# Previous command yields error
Invalid csv error
= Empty row in index: 6

后备

Gcalc 尝试将 CSV 值解析为预期数据类型。但用户可以为某些未定义的情况定义后备行为。

# Example csv file
count,probability,constant,cost
1,0.5,0.2,50
2,0.2,-,40
3,0.3,0.1,30
4,0.4,-,20
5,0.5,-,10

# Default value is 'none'
# Option is case insensitive, btw
gcalc <SUBCOMMAND> --ref ref.csv --constant 0.7 --fallback rollback|ignore|none

在上一个示例中,在第三个记录中,即 3,0.3,0.1,30

  • 回滚:将常数设置为 0.7,这是作为参数提供的初始值
  • 忽略:将常数设置为 0.2,这是常数的更新值。
  • 无:引发恐慌并终止程序

演示绘图图像

Demo

关于

为什么不使用简单的公式?

因为,现实生活中的应用并非像几何序列那样清晰明了。有时,某些Gacha阶段会有额外的奖励,还存在所谓的“已确认的Gacha系统”,这使得使用几何级数公式变得困难。

好吧,为什么不使用其他Gacha模拟器或计算器呢?

首先,模拟不是计算。这个crate的主要目的是关于期望和校准,特别是考虑到游戏开发。

其次,现有的计算器只考虑概率的固定值。然而,有很多内容会利用特定步骤的奖励概率,还有一些Gacha在不同情况下有不同的概率。

第三,这些内容难以与其他系统集成。它们大多数是简单的程序,带有集成的前端(GUI),最多只能松散地连接到其他游戏开发工具,自动化几乎不可能。

目标

  • 易于使用的概率检查和计算的二进制文件和库
  • 使用CSV文件轻松自动化
  • 多格式:跨平台二进制+wasm二进制
  • 与Jupyter笔记本集成

依赖项

~4.5–8.5MB
~117K SLoC