Minecraft JE: 原版实现随机数生成

在 Minecraft BE 中,存在指令 scoreboard players random <player> <objective> <min> <max> 可以实现随机数生成,但是在 Minecraft JE 中并没有这个指令

如果要在 Java 版中需要实现记分板随机数生成,可以通过提取实体的 UUID 实现

UUID

UUID(通用唯一识别码)是 128 位长的数字,在 Minecraft 中用来区分不同的对象实例。

在 Minecraft 中,所有实体都有一个 UUID 标签,其中存储了实体的 UUID

通过召唤任意实体,使用 /data get entity <entity> UUID 可以获取实体的 UUID

在实体数据中,UUID 的表示形式为 整型数组,即用4个32位数字表示。每一部分存储在由高到低的整型数组中。

这种表示方式的一个示例为 [I;-132296786,2112623056,-1486552928,-920753162]

随机数生成

通过提取上述 UUID 的数据,即可实现随机数生成

  1. 使用 /data get entity <entity> UUID[0] 可以获取 UUID 数组中的第一个整数

  2. 使用 /execute store result score <name> <objective> run data get entity <entity> UUID[0] 可以将 UUID 数组中的第一个整数存储到记分板中

  3. 使用 /scoreboard players operation <name> <objective> %= <range> <objective> 可以将记分板中的数值取余

完整示例

1
2
3
4
5
6
7
8
# 生成随机数标记
summon marker ~ ~ ~ {Tags:["random_uuid"]}
# 储存 UUID
execute store result score result random run data get entity @e[type=marker,tag=random_uuid,limit=1] UUID[0] 1
# 取余运算
scoreboard players operation result random %= range random
# 清除标记
kill @e[type=marker,tag=random_uuid]