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 次下载
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,这是常数的更新值。
- 无:引发恐慌并终止程序
演示绘图图像
关于
为什么不使用简单的公式?
因为,现实生活中的应用并非像几何序列那样清晰明了。有时,某些Gacha阶段会有额外的奖励,还存在所谓的“已确认的Gacha系统”,这使得使用几何级数公式变得困难。
好吧,为什么不使用其他Gacha模拟器或计算器呢?
首先,模拟不是计算。这个crate的主要目的是关于期望和校准,特别是考虑到游戏开发。
其次,现有的计算器只考虑概率的固定值。然而,有很多内容会利用特定步骤的奖励概率,还有一些Gacha在不同情况下有不同的概率。
第三,这些内容难以与其他系统集成。它们大多数是简单的程序,带有集成的前端(GUI),最多只能松散地连接到其他游戏开发工具,自动化几乎不可能。
目标
- 易于使用的概率检查和计算的二进制文件和库
- 使用CSV文件轻松自动化
- 多格式:跨平台二进制+wasm二进制
- 与Jupyter笔记本集成
依赖项
~4.5–8.5MB
~117K SLoC