I am trying to make some cabinets spawn randomly in a random generated maze but for some reason math.random() returns me a higher value than it is supposed to. For example, let’s say the value should be inbetween 59.75 and 60.25, but instead of that, it returns 61 or 59 and I have no idea why.
Here is the portion of code:

local xPosition = location.Position.X
local zPosition = location.Position.Z
local yRotation = location.Rotation.Y
local xSize = location.Size.X
local zSize = location.Size.Z
local x = math.random(xPosition - xSize / 2, xPosition + xSize / 2)
local z = math.random(zPosition - zSize / 2, zPosition + zSize / 2)
local y = script.Cabinet.Frame.Size.Y / 2 + script.MazeCell.Floor.Size.Y / 2
local rotation = math.random(yRotation - 30, yRotation + 30)
local cabinet = script.Cabinet:Clone()
cabinet.Parent = workspace.Maze.Shelves
local cframe = CFrame.new(x, y, z) * CFrame.Angles(0, math.rad(rotation), 0)
cabinet:SetPrimaryPartCFrame(cframe)

If you know another method of how I can do or fix this please let me know.

So I have a part in which I want to spawn a cabinet, but when I try calculating the Z position it just gives me a value that’s not inside the part. It’s the exact same calculation I used for X but X works fine.

math.random only takes in integers, not floats. As @RoninTurtles mentioned you should convert the float into an integer by multiplying the float by a certain amount, then dividing after. For example if you want a number between 0.1 ( x ) and 1 ( y ), firstly you should multiply each probable side by 10 to make each side an integer. Now we have 1 ( x ) and 10 ( y ). Now you use math.random() to calculate a random number between x and y as such:

math.random(x, y)

Now that you computed a random number between the two arguments, you now need to divide the computed number by the same number you multiplied with:

math.random(x, y) / 10

So the final formula is as such:

local x: number = 0.1
local y: number = 1
math.random(x * 10, y * 10) / 10

So in your case you should do:

local x0: number = (xPosition - xSize / 2) * 100
local x1: number = (xPosition + xSize / 2) * 100
local z0: number = (zPosition - zSize / 2) * 100
local z1: number = (zPosition + zSize / 2) * 100
local x: number = math.random(x0, x1) / 100
local z: number = math.random(z0, z1) / 100

You can just use Random.new():NextNumber() which should return decimal values.

local rmd = Random.new()
local number = rmd:NextNumber(0, 1)

So you dont really need to multiply and divide as much as you think you need to.

And also, it isnt entirely true that math.random() returns an integer, when you use it without any arguments. It gives you a decimal value between 0 and 1.

Pardon my inaccuracies. You are indeed correct, math.random() with no given arguments does project a random number between 0 and 1. When I said ‘math.random only takes in integers’ I specifically meant the arguments it takes in must be integers. I should’ve probably been more clear, apologies. My bad for also calling ‘doubles’ ‘floats’. I program in python quite a bit so that again is my bad.