#list #command-line-tool #random #model #pick #items #lottery

bin+lib rpick

通过各种算法从列表中选择项目。示例用途:选择你很久没去过的餐厅,或要听的音乐专辑。

29 个版本

0.9.1 2024 年 1 月 17 日
0.9.0 2023 年 7 月 17 日
0.8.13 2023 年 3 月 11 日
0.8.12 2022 年 11 月 19 日
0.2.0 2019 年 3 月 12 日

#134 in 命令行工具

Download history 2/week @ 2024-05-28 13/week @ 2024-07-02 198/week @ 2024-07-30

198 每月下载

GPL-3.0 许可证

71KB
1K SLoC

Audit CI Release

rpick 是一个命令行工具,它可以帮助您使用可配置的算法从列表中选择项目。

此工具的一个示例用法是选择餐厅。您可能希望通常去您很久没去过的餐厅,但您也可能不想使用严格的最近最少使用模型,并使用一些随机元素来使事情变得更有趣,比如最近最少访问的餐厅会有更高的机会。

安装

您可以使用 Arch AUR 软件包安装 rpick

$ git clone https://aur.archlinux.org/rpick.git
$ cd rpick
$ makepkg -sirc

或者在 Fedora 中

$ sudo dnf install rpick

或者在 Gentoo 中

$ sudo emerge app-misc/rpick

或者在 MacOS 中,假设您已经安装了 brew

$ brew install rust
# Be sure to read the output of this command and adjust your PATH as instructed.
$ cargo install rpick

如果您不使用上述系统之一,rpick 也可以在 crates.io 上找到。您可以通过首先 安装 Rust,然后使用 Rust 的 cargo 工具安装 rpick 来安装 rpick。

# Be sure to read the output of this command and adjust your PATH as instructed.
$ cargo install rpick

快速开始

rpick 将其状态保存在您家目录的配置目录中名为 rpick.yml 的 YAML 文件中。目前,用户必须手动创建此文件,rpick 将从那里进行管理。要开始使用一些示例,请在 Linux 中创建 ~/.config/rpick.yml,在 MacOS 中创建 ~/Library/Preferences/rpick.yml,或在 Windows 中创建 C:\Users\Alice\AppData\Roaming\rpick.yml,如下所示

---
prs:
  model: even
  choices:
    - paper
    - rock
    - scissors
restaurant:
  model: gaussian
  choices:
    - Spirits
    - Lucky 32
    - Centro
    - Sitti
    - Cookout

然后您可以让 rpick 为您选择一个剪刀石头布的游戏

$ rpick prs
Choice is scissors. Accept? (Y/n)

请注意,对于剪刀石头布使用高斯模型是不好的,因为您在猜测该模型结果方面有统计优势。让我们看看高斯模型

$ rpick restaurant
Choice is Lucky 32. Accept? (Y/n)

如果您说“是”,由于我们使用了高斯模型,它将像这样重写 yaml 文件

---
prs:
  model: even
  choices:
    - paper
    - rock
    - scissors
restaurant:
  model: gaussian
  stddev_scaling_factor: 3.0
  choices:
    - Spirits
    - Centro
    - Sitti
    - Cookout
    - Lucky 32

请注意,在调用 rpick 时,我们传入了参数 prsrestaurant - 这告诉 rpickrpick.yml 中查找这些对象,以确定使用哪些模型以及有哪些选项可用。此参数是必需的,但其可能值由你在配置文件中定义。

配置文件中的 model 字段定义了从给定的选项中选择时使用哪个数学模型。有关可用的模型及其配置的更多信息,请参阅下面的“模型”部分。

它为您原来的餐厅对象添加了一个设置:stddev_scaling_factor。您可以在下面的高斯模型文档中了解更多关于此设置的信息。

参数

CLI 接受一些参数

  • -c/--config:这可以用来指定用于 rpick 的配置文件的备用路径。您还可以设置 RPICK_CONFIG 环境变量。
  • -h/--help:打印帮助文本。
  • -v/--verbose:打印有关选择的更多信息。
  • -V/--version:打印 rpick 版本。

模型

rpick 能够使用几种不同的选择算法:均等、高斯、库存、彩票、LRU 和加权。

均等

even 分布模型是最简单的选择模型。它会给列表中要选择的每个字符串项均等的机会。它需要两个键

  • model:必须将此设置为字符串 "even",以选择此模型。
  • choices:这是一个字符串列表,是模型选择的选项。

示例

convertible_top:
  model: even
  choices:
    - up
    - down

在使用 rpick 进行此用例之前,您可能需要查看天气...

高斯

要了解高斯分布模型,我们首先需要研究 这个 XKCD 漫画

XKCD's Normal Distribution

gaussian 分布模型更复杂。它使用 高斯分布 来优先选择最近较少被选择的选项。列表顶部附近的选项被选中的概率最高,而列表末尾的选项被选中的概率最低。一旦选中一项,并且用户接受了该选择,该列表就会被保存到磁盘上,选中的项目将被移动到列表末尾。此模型接受三个键

  • model:必须将此设置为字符串 "gaussian",以选择此模型。
  • stddev_scaling_factor 用于计算标准差;标准差是选择列表长度的除以这个缩放因子。因此,较大的缩放因子将导致列表顶部项目的偏好更强,而较小的缩放因子将导致选择在项目间更加均匀分布。请注意,缩放因子越小,平均而言,rpick做出决策所需的时间越长。默认值为 3.0,这是因为它将列表中的最后一个项目放在三个标准差的位置,使其有0.03%的机会被选中。此键是可选的,默认为3.0。
  • choices:这是一个字符串列表,是模型选择的选项。

示例

album:
  model: gaussian
  stddev_scaling_factor: 5.0
  choices:
    - Fountains of Wayne/Fountains Of Wayne
    - Beck/Odelay
    - "Townes Van Zandt/High, Low and In Between"
    - Tori Amos/From The Choirgirl Hotel
    - Zao/Parade Of Chaos

为了展示此模型的相对频率的直观表示,这里是一个图表,该图表是通过调用高斯模型10,000次生成的,选择设置为从0到99的数字,默认 stddev_scaling_factor3.0

Gaussian example

库存

inventory 分布模型是 weighted 模型的动态版本。每个选择都有一个影响它们在这个回合被选中可能性的彩票数量。一旦选中一个项目,它就会丢失一张彩票,即减少该特定项目的库存量。它接受两个键

  • model:必须将该字符串设置为“inventory”,以选择此模型。
  • choices:必须是一个对象列表。每个对象接受两个键
    • name:这是必需的,是选择的名字。
    • tickets:此选择当前拥有的彩票数量。这是可选的,为整数,默认为1。

示例

tea:
  model: inventory
  choices:
    - name: "Tea… Earl Grey… Hot"
      tickets: 15
    - name: Black
      tickets: 2

彩票

lottery 分布模型也是 weighted 模型的动态版本。每个选择都有一个影响它们在这个回合被选中可能性的彩票数量。一旦选中一个项目,它就会将其彩票重置为 reset 张彩票,而每个未被选中的选择都会获得更多彩票。它接受两个键

  • model:必须将该字符串设置为“lottery”,以选择此模型。
  • choices:必须是一个对象列表。每个对象接受四个键
    • name:这是必需的,是选择的名字。
    • reset:选择被选中时重置的彩票数量。默认为0。
    • tickets:此选择当前拥有的彩票数量。这是可选的,为整数,默认为1。
    • weight:这是一个整数,表示在选择未被选中时分配给此选择的彩票数量。您可以使用它来影响此项目相对于其他选择的偏好频率。这是可选的,默认为1。

示例

activity:
  model: lottery
  choices:
    - name: exercise
    - name: read documentation
    - name: watch tv
      weight: 1000

LRU

lru(最近最少使用)模型是一个简单的有序FIFO(先进先出)列表。最少最近被选中的项目是列表中的第一个项目。每次选择时,rpick会简单地选择用户说“是”的列表中的第一个项目,然后将该项目移动到列表的末尾。它接受两个键

  • model:必须将该字符串设置为“lru”,以选择此模型。
  • choices:必须是一个字符串列表。最少最近被选中的项目应位于列表开头。

示例

code:
  model: lru
  choices:
    - Add a feature
    - Fix a bug
    - Write some docs

加权

weighted 分布模型是 even 模型的一个更通用版本,允许您为每个选择表达不同的权重。它接受两个键

  • model:必须设置为字符串“weighted”,以便选择此模型。
  • choices:必须是一个对象列表。每个对象接受两个键
    • name:这是必需的,是选择的名字。
    • weight:这是一个表示选择的权重的整数。它是可选的,默认为1。

示例

cereal:
  model: weighted
  choices:
    - name: generic bran flakes
    - name: cracklin oat bran
      weight: 1000

变更日志

请参阅变更日志

贡献

如果您想为rpick做出贡献,请给我发送一个补丁!

如果您系统上有podman,有一个方便的Makefile用于开发。它的默认目标是帮助菜单,用于描述可用的目标。

# Note that root is not required.
$ make check

podman开发环境在config.yml中查找rpick配置。

依赖项

~10–18MB
~233K SLoC