教程/随机发生器

来自Minecraft Wiki
跳转至: 导航搜索

随机发生器(Randomizer)(又作随机数发生器、随机数生成器(Random Number Generator)等,缩写为RNG)是会产生随机信号的红石电路。它们能被应用在很多地方,从操纵一场灯光秀,到建造一个赌场。特别指出,随机发生器像大多数红石电路一样,只能在已加载出的区块里工作。如果是用于一个探险地图或一些玩家会走得很远的地图,可以将随机发生器建造在出生点区块‌‌[仅Java版]常加载区域‌‌[仅基岩版]

实体随机发生器[编辑 | 编辑源代码]

投掷器随机发生器[编辑 | 编辑源代码]

一个投掷器随机发生器

这个随机发生器利用了这样一个事实,投掷器以随机顺序发射物品。每当提供一个信号时,它会输出一个强度为1或3的信号。 要建造它,按照图中的方式放置一个投掷器,漏斗,和红石比较器。 然后把有不同堆叠上限的物品放入投掷器中,如一把剑和一块泥土。当你激活投掷器,它会把一个物品放入漏斗,从而激活比较器。 由于物品占用的空间不同,因此信号强度也会有所不同。看起来好像将物品数堆叠至16时会输出强度为2的信号,但不幸的是除非漏斗事先装了物品,否则将物品数堆叠至16只能得到强度为1的信号。

潜影盒随机发生器[编辑 | 编辑源代码]

潜影盒能被发射器放置,被活塞破坏,并保留其中的物品。当一个潜影盒被发射器随机放置时,比较器可以产生15种不同的红石信号。

生物随机发生器[编辑 | 编辑源代码]

绊线钩制作的猪随机发生器
压力板制作的生物随机发生器(显示出了红石)

生物随机发生器是利用生物随机移动的特性触发红石的随机发生器。当需要多个输出时,这种随机发生器是最好的。信号何时发生或持续多久都无关紧要。 猪随机发生器通常用压力板绊线钩制作。用绊线钩是最简单的方法,但是需要更多铁。

随机发生器中使用的生物类型可以创造出一些重要的变种。一些常见的选择包括:

  • , 因为它们很小而且容易繁殖。
  • 雪傀儡, 因为它们很安静。
  • 和其他两格宽的生物, 因为它们处于触发机关状态时的可能性更大。
  • 蝙蝠,因为它们会频繁地开关机关。

唱片机随机发生器[编辑 | 编辑源代码]

Information icon.svg
此特性为基岩版独有。
In
唱片机随机发生器

这种随机发生器使用唱片机漏斗产生强度为1-12的随机红石信号。此机器的独特之处在于大多数其他的随机发生器不会产生具有如此多可能性的模拟信号。这种随机发生器的两个缺点是,它只能在每个音乐唱片播放完毕并取走后才会改变信号,并且这可能造价高昂。

模拟信号输出随机发生器[编辑 | 编辑源代码]

双电平模拟信号输出[编辑 | 编辑源代码]

双电平模拟信号输出随机发生器

投掷器包含一个可堆叠物品和一个不可堆叠物品。



1×3×2(体积为6方块)、1方块宽、单片、无声
电路延迟:3刻(上升沿)和1刻(下降沿)

开启时输出信号强度为1或3,关闭时输出信号强度0。

当输入打开时,投掷器将随机选择可堆叠或不可堆叠的物品放进漏斗,导致比较器输出1或3信号强度。因为充能的投掷器是一个实心/不透明方块,它也会锁住漏斗,防止它将物品送回投掷器,直到输入关闭。

输出信号强度可以按原样使用(例如,在减法模式下从比较器中减去1或3),但更常用的是,把输出连接到一行两个的红石粉,以使输出为0或非0(随机为中继器充能,激活机器组件等)。

变种:如果投掷器是间接激活的(例如,通过准连接性或相邻的充能方块),则不会锁住漏斗,并且漏斗会立即将物品推回投掷器中。这将使电路变成一个单稳态上升沿探测器,输出脉冲为3.5刻(仍具有1或3的随机信号强度)。

在投掷器中只有两个物品的情况下,两个信号强度的输出概率相等。输出信号强度的概率可以通过向投掷器添加额外的可堆叠和不可堆叠物品来改变(这些物品必须彼此不同,以便它们不会堆叠)。例如,对于两个不同的可堆叠物品和三个不同的不可堆叠物品,随机发生器将在40%的时间内输出1信号强度,在60%的时间内输出3信号强度。

已知最早发布日期:2013年3月14日[1]

三电平模拟信号输出[编辑 | 编辑源代码]

三电平模拟信号输出随机发生器

投掷器包含一个堆叠上限为64的物品,一个堆叠上限为16的物品,和一个不可堆叠物品。



漏斗的最右边个堆叠上限为16的物品。

5
1×3×3(体积为9方块)、1方块宽、无声
电路延迟:3刻(上升沿)和1刻(下降沿)
开启时输出信号强度为1、2或4,关闭时输出信号强度(但请参阅下面的变种)。
在建立此电路时,等待漏斗被充能的红石粉锁住,然后将五个堆叠上限为16的物品放入其最右侧的槽位中。然后将一个堆叠上限为64的物品,一个堆叠上限为16的物品,和一个不可堆叠物品放入投掷器。
输入开启之前,漏斗的5个堆叠上限为16的物品足以使其比较器产生1级信号强度(即使是单个堆叠上限为64的物品也可以)。这五个物品应永远无法回到投掷器,所以比较器的输出将永远不会低于1。
当输入开启时,投掷器将一个物品送入漏斗,将其放置在漏斗的左槽中。需要23个堆叠上限为64的物品(或5个堆叠上限为16的物品和3个堆叠上限为64的物品,或6个堆叠上限为16的物品)才能产生2级信号强度,因此,如果堆叠上限为64的物品被送入,则不足以增加输出信号强度,但如果堆叠上限为16的物品被送入,则输出信号强度将增加到2级。如果不可堆叠的物品被送入,输出信号强度将增加到4。
当电路关闭时,漏斗由充能的红石粉锁住,当电路开启时,由充能的投掷器锁住。但是,当输入关闭时,投掷器刚关闭的瞬间会有一个短暂的1刻间隙,但是放置其上的火把没有再次点亮。这允许漏斗激活一刻,将一个物品送回投掷器。漏斗总是先从左边的槽中送出物品,因此漏斗会将投掷器送入的物品送回,而不是最右边槽中的堆叠上限为16的物品中的任何一个,这样电路就可以自行复位。
变种:玩家可以从投掷器中移除其中一个物品来创建一个双电平随机发生器,其输出信号强度不同于常规的双电平随机发生器:移除堆叠上限为64的物品对应输出信号强度为2或4,移除堆叠上限为16的物品对应输出信号强度为1或4,移除不可堆叠物品对应输出信号强度为1或2。
您可以从漏斗引出额外的红石线路到旁边的一个方块,然后向下连接到比较器的侧面。这种2方块宽的变种将保证输入关闭时,比较器的输出关闭。
在投掷器中只有三个物品的情况下,所有三个输出信号强度将以相同的概率选择。输出信号强度的概率可以通过向投掷器添加额外的堆叠上限为64、堆叠上限为16和不可堆叠的物品来改变(这些物品必须彼此不同,这样它们就不会堆叠)。例如,对于一个堆叠上限为64的物品、一个堆叠上限为16的物品和两个不同的不可堆叠物品,随机发生器将在25%的时间内输出信号强度为1、25%的时间输出信号强度为2、50%的时间输出信号强度为4的红石信号。
可以向漏斗添加额外的物品,以增加整体的输出信号强度。
已知最早发布日期:2013年4月16日[2]

十六电平模拟信号输出[编辑 | 编辑源代码]

5×8×4(体积为160方块)
电路延迟:8.5刻
开启时输出信号强度为0至15,关闭时输出信号强度0。
使用四个双电平随机发生器从15级信号强度中减去1、2、4和/或8级信号强度。
减少双电平随机发生器的数量会减少可能的输出:3个双电平随机发生器产生八电平随机发生器,2个双电平随机发生器产生四电平随机发生器(确切的信号强度取决于提供给减法比较器的信号强度)。
已知最早发布日期:2013年6月10日[3]

示意图:十六电平模拟信号输出随机发生器

命令随机发生器[编辑 | 编辑源代码]

基于随机刻的设计[编辑 | 编辑源代码]

Information icon.svg
此特性为Java版独有。

这个随机发生器使用重复的命令方块,每个刻度加1分,然后另一个重复的命令方块将值截断到最大值。当需要随机值时,使用重复的命令方块来测试特定值。此装置不是完全随机的,因为它是基于激活的时间,但对于大多数目的来说是随机的。

在本例中,最小值为10,最大值为20。 首先,必须创建一个伪记分板目标来存储值:/scoreboard objectives add randomizer dummy。接下来,需要两个重复的命令方块,都设置为“保持开启”。第一个在每个刻度上加1分:/scoreboard players add ticks randomizer 1。第二个将值截断为上述最小值和最大值:/execute if score ticks randomizer matches 21.. run scoreboard players set ticks randomizer 10(其中“21”是最大排外值,“10”是最小值)。最后,需要一组测试每个值的命令方块,所有这些命令块都附加到单个输入;例如,/execute if score ticks randomizer matches 2 run say hi如果10到20之间的随机值是2,则运行/say hi(将[@] hi发送至聊天框中)。下面的示意图显示了一个示例装置,其中测试每个值的命令方块附加到同一个输入:

基于随机刻的随机发生器

基于目标选择器的设计[编辑 | 编辑源代码]

Information icon.svg
此特性为Java版独有。

本设计基于随机目标选择器参数随机目标选择器参数limit=1,sort=random),为NOPEname[4]设计的拓展。

本设计需要执行下列命令来初始化,为便利起见,你可以把他们放到一个函数中。

scoreboard objectives add RandomBit dummy
execute unless entity @e[type=armor_stand, tag=RandomizerResult] run summon minecraft:armor_stand 0 -1 1 {Marker: 1b, NoGravity: 1b, Invisible: 1b, Silent: 1b}
tag @e[type=armor_stand,x=0,y=-1,z=1] add RandomizerResult
scoreboard players set @e[tag=RandomizerResult] RandomBit 0
execute unless entity @e[type=armor_stand, tag=Randomizer] run summon minecraft:armor_stand 0 -1 0 {Marker: 1b, NoGravity: 1b, Invisible: 1b, Silent: 1b}
execute unless entity @e[type=armor_stand, tag=Randomizer] run summon minecraft:armor_stand 1 -1 0 {Marker: 1b, NoGravity: 1b, Invisible: 1b, Silent: 1b}
tag @e[type=armor_stand,x=0,y=-1,z=0] add Randomizer
tag @e[type=armor_stand,x=1,y=-1,z=0] add Randomizer

其中execute unless的部分不是必须的, 但加上它们可以保证多次执行这一系列命令时本设计仍能正常运作(例如,你把这些命令放到一个函数中,而出于测试目的需要在同一个世界中多次执行这个函数)。

然后,每当你需要获取一个随机的位(即0或1)时,执行下列命令。你可以逐行手动输入这些命令,或者用命令方块链,或者定义一个函数。

tag @e[type=armor_stand,tag=Randomizer] remove PickedBit
tag @e[type=armor_stand,tag=Randomizer,sort=random,limit=1] add PickedBit
execute store result score @e[type=armor_stand, tag=RandomizerResult] RandomBit run data get entity @e[type=armor_stand, tag=PickedBit,limit=1] Pos[0]

这样就得到了一个随机的位,该位的值存放在带有RandomizerResult标签的盔甲架的名为RandomBit的记分板目标中。

本设计可以轻易拓展成大范围随机整数发生器。

基岩版[编辑 | 编辑源代码]

Information icon.svg
此特性为基岩版独有。

基岩版自带对随机记分板目标的支持。只需用命令/scoreboard players random ...即可。

參考[编辑 | 编辑源代码]

  1. “HiFolksImAdam”(2013年3月14日)Minecraft 1.5 Tutorial: Simple Random Number Generator!(视频)-YouTube
  2. “Kwin van der Veen”(2013年4月16日)Video response: Sharing is Caring #010: 1 Bit Randomizer & Silent BUD(视频)-YouTube.
  3. “Entity”(2013年6月10日)Calling All Redstone Geniuses, I need Help. - advanced randomizer.Minecraft Forum
  4. https://www.youtube.com/watch?v=hHyottJ13K0