A Random Feature


#1

Hey everyone,

In observance of the gift-giving season, we’re releasing a new Lua datatype: Random.
Random is used to generate high-quality pseudorandom numbers from a dedicated internal state.

API


Random.new([double seed])

Creates a new Random object from the given seed.
Multiple Randoms seeded with the same value will always produce the same number sequence.
If a seed isn’t specified, one will automatically be pulled from an internal entropy source.

int Random:NextInteger(int min, int max)

Returns a pseudorandom integer uniformly distributed over [min, max].

double Random:NextNumber([double min=0, double max=1])

Returns a pseudorandom number uniformly distributed over [min, max).

Random Random:Clone()

Returns a new Random object with the same state as the original.
This method can be useful for branching off the results of the RNG.

Technical details


The algorithm used by Random is the XSH-RR variant of the PCG family.
In a nutshell, it’s is a fast algorithm with excellent statistical properties.
We’re planning to change math.random to use the same algorithm by early next year.

Examples


Flip a coin

local rng = Random.new()
local function CoinFlip()
	return rng:NextNumber() < 1/2 and 'Heads' or 'Tails'
end

Shuffle an array

local rng = Random.new()
local function Shuffle(t)
	for i = #t, 2, -1 do
		local j = rng:NextInteger(1, i)
		t[j], t[i] = t[i], t[j]
	end
end

Generate a random color

local rng = Random.new()
local function RandomColor()
	local r = rng:NextNumber(0, 255)
	local g = rng:NextNumber(0, 255)
	local b = rng:NextNumber(0, 255)
	return Color3.fromRGB(r, g, b)
end

Feel free to post questions and comments; our team would love to hear your feedback.

This is live. Happy holidays!


Math.randomseed seemingly broken?
Impossible to find documentation for the Random class
#2

YES i am excited


#3

Pretty cool :sunglasses:


#4

Awesome!! :+1:


#5

That’s sweet!


#6

Wow that local Name do stuff is blowing my mind I gotta test this real quick

And awesome can’t wait to use


#7

Well, that was random. Cool!


#8

can’t wait to be accurately random!
:thinking:


#9

Can the state be replicated between sessions, or saved with a place/model, or be read and set?


#10

You guys had better make me proud and make cool stuff with this!


#11

Random Simulator

Front page, let’s make it happen


#12

State doesn’t replicate/serialize/persist for now. That’s something we could totally look into if there turns out to be a strong-enough case for it.

For now, you can get similar results by saving the initial seed along with a count of how many times NextInteger+NextNumber have been called.


#13

Are you making any sense of the local Name do thing? Because I’m not. How the hell does it work lol.


#14

local x = 0

do
local y = 3
x = 2 + y
end

print(x, y) -- 5, nil

He’s doing it like that so rng only exists in that do scope.


#15

What’s it good for? Memory optimisation?


#16

Well, here’s a breakdown of how it works:

local Name – Stores the variable in the script

Now, a do statement is basically useless except for one thing: Scope.
The scope of a variable is where it can used - it has to be used within its scope.

When the scope is done, all variables assigned to it will be removed from the memory (I assume). The Name variable is out of the do's scope so it doesn’t get removed.


#17

That name oddly scared me for a moment.

EDIT: OH OH CLEVER TITLE


#18

It still exists in memory, since the function is using it. But it helps not pollute the global scope. So if you wanted to define multiple functions that use their own instances of Random this is one way to do it.


#19

I see, that’s good to know. Thanks! ( + @EmeraldSlash )


#20

This is a very awesome update. I can’t wait to test it out. :slight_smile: