版本:1.15.2,已知运行命令 data get storage foo:example List 可以获得一个列表,那么如何打乱这个列表内元素的顺序?请简述你的方法,效率高的答案优先。
Wudji 发表于 2020-4-5 16:38
https://www.mcbbs.net/thread-993805-1-1.html
https://www.mcbbs.net/thread-993805-1-1.html
(=°ω°)丿:我回答我自己
DoYo_GZ 发表于 2020-4-5 17:14
(=°ω°)丿:我回答我自己
(=°ω°)丿:我回答我自己
额。。。。。。
首先定义一个谓词minecraft:random
再定义一个函数minecraft:a
原理:
先将foo:example.List的0号元素取出,接着有50%的几率被放在foo:copy.List的首项,有50%的几率被放在foo:copy.List的末项
然后将foo:example.List的0号元素删除
接着判断foo:example.List的0号元素是否存在(也就是判断是否还有余下的元素
若还有,则进行递归
最后得到的foo:copy.List即为打乱后的foo:example.List建议连续打乱两次,否则有些组合不会出现或者不固定取出0号,而是有50%取出0号,50%取出-1号
代码:
- {
- "condition":"minecraft:random_chance"
- "chance":0.5
- }
再定义一个函数minecraft:a
代码:
- scoreboard objective add t dummy
- scoreboard players set #system t 0
- execute if predicate minecraft:random run scoreboard players set #system t 1
- execute if score #system t matches 0 run data modify storage foo:copy List append from storage foo:example List[0]
- execute if score #system t matches 1 run data modify storage foo:copy List prepend from storage foo:example List[0]
- data remove storage foo:example List[0]
- execute if storage foo:example List[0] run function minecraft:a
先将foo:example.List的0号元素取出,接着有50%的几率被放在foo:copy.List的首项,有50%的几率被放在foo:copy.List的末项
然后将foo:example.List的0号元素删除
接着判断foo:example.List的0号元素是否存在(也就是判断是否还有余下的元素
若还有,则进行递归
最后得到的foo:copy.List即为打乱后的foo:example.List建议连续打乱两次,否则有些组合不会出现或者不固定取出0号,而是有50%取出0号,50%取出-1号