灵感来源为一次我在写战利品表时的偶然想法
原理:借助战利品表来生成随机损坏值的工具,来生成随机数。

模块功能
本模块适用于随机数的生成,并可加权生成随机数值;自带调试功能,防止出现错误
使用方法
初始化:
| 1、下载并解压文件,并将所得文件夹放进存档里的datapacks文件夹内;2、进入游戏,即可正常加载; 3、若无法正常加载,尝试输入/reload; 4、加载完成后输入/function ran:start建立必要的计分板。 |
生成随机数:
| 1、修改需要生成随机数的实体的ran_min与ran_max分数,确定一个范围; 2、输入/execute as <目标实体> at @s run function ran:random即可在指定范围内生成随机数; 3、最终的分数会保存至该实体的ran分数(显示为random)中。
|
生成加权随机数:
| 1、输入/function ran:setweight建立一个加权随机数组; 2、根据所得反馈值(只有函数的执行者能看见),编辑该实体的ran_min、ran_max、ran_weight分数; 示例:/scoreboard players set @e[scores={ran_weightid=0}] ran_min 1 3、所有数组设置完毕后,输入/execute as <目标实体> at @s run function ran:weight即可加权随机生成数值; 4、所有数组的存在形式是拥有ran_weight标签的盔甲架,若需要清空数组只需输入/kill @e[tag=ran_weight]即可。
|
调试模式:

代码解析
战利品表:random.json
|
函数ran:start 用于建立计分板
|
函数ran:random 用于产生随机数
| tag @s add ran_creating summon armor_stand ~ -10 ~ {Tags:["ran"]} summon chest_minecart ~ -10 ~ {LootTable:"ran:random"} execute positioned ~ -10 ~ run kill @e[sort=nearest,type=chest_minecart,limit=1] #激活战利品表 scoreboard players set @e[tag=ran] ran 1024 execute positioned ~ -10 ~ as @e[sort=nearest,type=item,nbt={Item:{id:"minecraft:diamond_sword"}},limit=3] store result score @s ran run data get entity @s Item.tag.Damage execute positioned ~ -10 ~ as @e[sort=nearest,type=item,nbt={Item:{id:"minecraft:diamond_sword"}},limit=1] store success entity @s Item.Count byte 0 run scoreboard players operation @e[tag=ran_creating] ran = @s ran scoreboard players operation @e[tag=ran_creating] ran *= @e[scores={ran=1024}] ran execute positioned ~ -10 ~ as @e[sort=nearest,type=item,nbt={Item:{id:"minecraft:diamond_sword"}},limit=1] store success entity @s Item.Count byte 0 run scoreboard players operation @e[tag=ran_creating] ran += @s ran scoreboard players operation @e[tag=ran_creating] ran *= @e[scores={ran=1024}] ran execute positioned ~ -10 ~ as @e[sort=nearest,type=item,nbt={Item:{id:"minecraft:diamond_sword"}},limit=1] store success entity @s Item.Count byte 0 run scoreboard players operation @e[tag=ran_creating] ran += @s ran #采用1024进制(???),随机生成一个0~1073741823的随机数 scoreboard players operation @e[tag=ran_creating] ran += @e[tag=ran_creating] ran execute positioned ~ -10 ~ as @e[sort=nearest,type=item,nbt={Item:{id:"minecraft:stone"}},limit=1,distance=..1] store success entity @s Item.Count byte 0 run scoreboard players add @e[tag=ran_creating] ran 1 #将最初的随机数翻倍,并随机决定是否加上1,得到0~2147483647之间的随机数 scoreboard players operation @s ran_delta = @s ran_max scoreboard players operation @s ran_delta -= @s ran_min scoreboard players add @s ran_delta 1 #确定随机数的生成范围 scoreboard players set @e[tag=ran,limit=1] ran 2147483647 scoreboard players operation @e[tag=ran,limit=1] ran /= @e[tag=ran_creating] ran_delta scoreboard players operation @e[tag=ran_creating] ran /= @e[tag=ran,limit=1] ran #将2147483647分成数个组,根据所得随机数落在哪一个组来决定随机数的大小 scoreboard players operation @s ran += @s ran_min #得到指定范围内的随机数 execute positioned ~ -10 ~ run kill @e[sort=nearest,limit=1,type=armor_stand,tag=ran] tag @s remove ran_creating execute if score @s ran > @s ran_max run function ran:random #检查随机数是否落在指定范围内,若不是则重新生成随机数 |
函数ran:setweight 用于生成随机数组
|
函数ran:weight 用于随机选取加权数组并生成随机数
|
函数ran:inputfunction1 用于辅助ran:weight函数选取合适的数组
|
函数ran:randomdebug 用于分析是否能将ran:random在某个实体上应用
|
函数ran:weightdebug 用于检测是否能将ran:weight应用在目标实体上
|
函数ran:inputfunction2 用于协助ran:weightdebug 来检查每个随机数组的数值
|

想说的话
其实如果能看懂我的这个方法的大体思路之后,或许就可以不使用我的模块,自制战利品表来生成随机数。自制战利品表可以通过掉落的概率很轻松地控制每个随机数的可能性大小。但我之所以要把这个作品放出来,也是想给大家提供一个新思路(因为暂未看到bbs内有借助战利品表做随机数的先例(至少我没发现))。这也是我的第一个作品吧,希望能得到大家的认可。不会用图床,图片只能用附件来上传了。
原链接:[随机模块]一个借助战利品表生成随机数的模块 (现该模块已更名为随机数模块)
下载地址:https://pan.baidu.com/s/16KkMV76-ikDwxxTuTCkLXA 提取码:q6iq
此为作者自转
