How do i assign perlin noise

I am trying to make a procedural map using perlin noise. I have made a script that generates a plane mesh, and now i want to use mathf.perlinnoise to create hills. But i cannot figure out how to implement it.

My plane generation script was made with the help of quill18’s tile map tutorial.

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(MeshCollider))]

public class TileMap2 : MonoBehaviour {

	public int size_x = 100;
	public int size_z = 50;
	public float tileSize = 1.0f;
	
	

	// Use this for initialization
	void Start () {
	
		BuildMesh();
	
	}
	

	public void BuildMesh () {
	
		int numTiles = size_x * size_z;
		int numTris = numTiles * 2;
	
		int vsize_x = size_x +1;
		int vsize_z = size_z +1;
		int numVerts = vsize_x * vsize_z;
		
		float noise = 0.1f;

	
		// generate the mesh data
		Vector3[] vertices = new Vector3[numVerts];
		Vector3[] normals = new Vector3[numVerts];
		Vector2[] uv = new Vector2[numVerts];
		
		int[] triangles = new int[ numTris * 3 ];
	
		int x, z;	

            //my perlin noise nonsense..???

		var noiseOffset = new Vector2(Random.Range(0f, 100f), Random.Range(0f, 100f));
		
		for(z=0; z < size_z; z++) {
			for(x=0; x < size_x; x++) {
				
				var a = z * vsize_x + x + noiseOffset.x;
				var b = z * vsize_x + x + noiseOffset.y;
				noise = Mathf.PerlinNoise(a, b);
				
				
			}
		}

				
	
		for(x=0; x < vsize_x; x++) {
			for(z=0; z < vsize_z; z++) {
							
				vertices[ z * vsize_x + x ] = new Vector3( x*tileSize, noise, z*tileSize );
				normals[ z * vsize_x + x ] = Vector3.up;
				uv[ z * vsize_x + x ] = new Vector2( (float)x / size_x, (float)z / size_z );
			}
		}
		
		for(z=0; z < size_z; z++) {
			for(x=0; x < size_x; x++) {
				int squareIndex = z * size_x + x;
				int triOffset = squareIndex * 6;
				triangles[triOffset + 0] = z * vsize_x + x + 		   0;
				triangles[triOffset + 2] = z * vsize_x + x + vsize_x + 1;
				triangles[triOffset + 1] = z * vsize_x + x + vsize_x + 0;
				
				triangles[triOffset + 3] = z * vsize_x + x + 		   0;
				triangles[triOffset + 5] = z * vsize_x + x + 		   1;
				triangles[triOffset + 4] = z * vsize_x + x + vsize_x + 1;
		
			}
		}
		

					
		// create new mesh and populate with the data
		Mesh mesh = new Mesh();
		mesh.vertices = vertices;
		mesh.triangles = triangles;
		mesh.normals = normals;
		mesh.uv = uv;
		
		// assign our mesh to our filter/renderer
		MeshFilter mesh_filter = GetComponent<MeshFilter>();
		MeshRenderer mesh_renderer = GetComponent<MeshRenderer>();
		MeshCollider mesh_collider = GetComponent<MeshCollider>();
		
		mesh_filter.mesh = mesh;
		mesh_collider.sharedMesh = mesh;
		
	}
}

When i run the script now, it sets the entire plane at a random height. If i run the perlin noise stuff in the for loop making the mesh, it just becomes noise (or if i dont use random.range, nothing).
I understand i have to change the y axis of Vertecies. But how do i implement the smooth perlin noise? I am still learning, especially c#…

In lines 50-59 you are generating perlin noise for each point but only storing the last value. So when you assign the positions of the verticies in lines 63-70 you use the last generated height for all verticies. You would either have to store the generated heights or use each one immediately. i.e. replace lines 50-70 with

for(x=0; x < vsize_x; x++) {
    for(z=0; z < vsize_z; z++) {                 
        var a = z * vsize_x + x + noiseOffset.x;
        var b = z * vsize_x + x + noiseOffset.y;
        noise = Mathf.PerlinNoise(a, b);
                             
        vertices[ z * vsize_x + x ] = new Vector3( x*tileSize, noise, z*tileSize );
        normals[ z * vsize_x + x ] = Vector3.up;
        uv[ z * vsize_x + x ] = new Vector2( (float)x / size_x, (float)z / size_z );
    }
}

Thank you… after messing with it for a while i came up with this:

		var noiseOffset = new Vector2(Random.Range(0f, 10f), Random.Range(0f, 10f));
	
		for(x=0; x < vsize_x; x++) {
			for(z=0; z < vsize_z; z++) {
				
				var a = x + size_x * 2f + noiseOffset.x;
				var b = z + size_x * 2f + noiseOffset.y;			
				
				float noise = Mathf.PerlinNoise(a / 10, b / 10);
				
							
				vertices[ z * vsize_x + x ] = new Vector3( x*tileSize, noise * 10, z*tileSize );
				
				normals[ z * vsize_x + x ] = Vector3.up;
				
				uv[ z * vsize_x + x ] = new Vector2( (float)x / size_x, (float)z / size_z );
			}
		}

Any suggestions to how i can mix 2 or more x perlin noise to get a more natural terrain?