Talk:Tutorials/Randomizers

Using redstone wire to activate multiple command blocks is outdated since 1.9 because you could use command chains instead and since 1.12, you could even use functions. To keep the concept generally applicable and overviewable, it would be better to list the commands and just give the option of using command blocks while still leaving space for better alternatives. Tick-Based randomizers have been used for a long time, but they don't work well for many cases and have obvious flaws. Commonly used methods in modern times would be scaling down UUIDs, using loot tables, using predicates or using pseudo-random algorithms like LCG.

There are libraries or native implementations for each of these methods. The libraries are, beyond others, featured by the RNG module of the Minecraft Phi data pack. Kappascopezz (talk) 00:23, 5 March 2020 (UTC)

New RNG Method
I was able to get a form of RNG working (tested in 1.16.3, but should work in any version with /scoreboard players operation) by using a combination of how the language C implements RNG (see here: https://stackoverflow.com/questions/4768180/rand-implementation ) and a bunch of scoreboard operations. All commands below should handle generating random numbers between 0 and 99.

Commands that need to be run once:

scoreboard objectives add rng_mult dummy scoreboard objectives add rng_add dummy scoreboard objectives add rng_div dummy scoreboard objectives add rng_range dummy

scoreboard players set PLAYER rng_mult 1103515245 scoreboard players set PLAYER rng_add 12345 scoreboard players set PLAYER rng_div 65536 scoreboard players set PLAYER rng_range 100
 * 1) This line specifies the highest number + 1 of the range of numbers (the 100 here means numbers from 0 to 99 can be obtained).

Commands that should be run every tick (or when you need a random number, but the former is preferrable):

execute as PLAYER run scoreboard players operation @s random *= @s rng_mult execute as PLAYER run scoreboard players operation @s random += @s rng_add execute as PLAYER run scoreboard players operation @s random /= @s rng_div execute as PLAYER run scoreboard players operation @s random %= @s rng_range

Advantages over other setups in JE (since BE already has /scoreboard players random):


 * Runs entirely in command blocks/functions, so no need for physical blocks to be placed, or for entities to keep loaded
 * Possibly easier to set up than the proposed alternatives on the wiki
 * Super easy to get a large variety of numbers from, just change the rng_range objective for what numbers you want

Limitations:


 * Requires commands
 * rng_range can't be higher than 65536.

If anyone finds this confusing, I'm happy to try to explain it better! Would love to see this added to the wiki, as it's a method of RNG that's been proven to work well (at least in the C programming language), and it's easy to scale to higher numbers without needing tons of commands and/or entities!

Hammy275 (talk) 16:40, 12 October 2020 (UTC)