The math.noise funtion in roblox has up to 3 parameters and returns a numbers between -1 and 1, although it mostly stays between 0.5 and -0.5.

While the number of parameters of the function has doesn't change when the dimension changes (1D - 2D, 2D - 3D), what those values represent does.

When using math.noise fo 3D noise, the values represent the XYZ coordinates, while for 2D noise,the third value can be used as a seed

```
local y = math.noise(x,z,seed)
```

To ensure that there aren't gaping holes in the ground or in the terrain we generate, we would use numeric for loops for both x and z (and common sense of course).

```
local TerrainScale = 0.9
local seed = 141421356237
for x = 0,50 do
for z = 0,50 do
local y = math.noise(x*TerrainScale,z*TerrainScale,seed)
end
end
```

Some people reading this might be wondering: "Why are you multiplying the x and z by a decimal?" This is because calling the math.noise function and only sending integers as arguments would result in the function always returning 0 (which there isn't anything random about)

```
local scale = 0.9
local seed = 141421356237
for x = 0, 50 do
for z = 0,50 do
local part = Instance.new("Part")
local y = math.noise(x*scale,y*scale,seed)
part.Size = Vector3.new(4,15,4)
part.CFrame = CFrame.new(x*4,y*20,z*4)
part.Parent = workspace
end
wait() --so your computer doesn't get wrecked
end
```

Note that it is important to multiply the number returned by the noise function by a number larger than one, perferably >10 as the number returned is only between -1 and 1, which isn't really that large of a range

Usually what people aim for here is a minecraft-esqe terrain. Which means there are different materials dependent on what height you are at, also there are random rare veins of gems and ores all around.

To make our terrain like this, we can use one of two things: math.random or Random:new()

```
local scale = 0.9
local seed = 141421356237
local ran = Random.new(tick())
for x = 0, 50 do
for z = 0,50 do
local part = Instance.new("Part")
local y = math.noise(x*scale,y*scale,seed)
part.Size = Vector3.new(4,15,4)
part.CFrame = CFrame.new(x*4,y*20,z*4)
part.Parent = workspace
part.Material = Enum.Material.Grass
part.Color = Color3.new(0,1,0)
if y * 20 <= -4 then--make it stone if it is below a certain height
part.Material = Enum.Material.Stone
part.Color = Color3.new(0.7,0.7,0.7)
if ran:NextNumber() < 0.05 -- 5% chance (ruby)
part.Material = Enum.Material.Foil
part.Color = Color3.new(1,0,0)
end
end
end
wait() --so your computer doesn't get wrecked
end
```

If you are using random.new(), you would use the NextNumber function of it to generate a random number between 0 and 1, or of interval [0,1). This is the equivalent of running math.random() without any parameters.

Hopefully you learned something new!

```
hint: round down or up
```

Hope you enjoyed :3