so i have a script which generates a 2d block world but how do i make a block placeing script which matches the blocks with my generated world?

The World generaor Script:
public int width;
public int height;
public int distance;
public int space;

public GameObject Grass;
public GameObject Dirt;
public GameObject Stone;

public float heightpoint;
public float heightpoint2;

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

void Generation()
{
    distance = height;
    for (int w = 0; w < width; w++)
    {
        int lowernum = distance - 1;
        int heighernum = distance + 2;
        distance = Random.Range(lowernum, heighernum);
        space = Random.Range(12, 20);
        int stonespace = distance - space;

        for (int j = 0; j < stonespace; j++)
        {
            Instantiate(Stone, new Vector3(w, j), Quaternion.identity);
        }

        for (int j = stonespace; j < distance; j++)
        {
            Instantiate(Dirt, new Vector3(w, j), Quaternion.identity);
        }
        Instantiate(Grass, new Vector3(w, distance), Quaternion.identity);
    }
},the generating script:

public int width;
public int height;
public int distance;
public int space;

public GameObject Grass;
public GameObject Dirt;
public GameObject Stone;

public float heightpoint;
public float heightpoint2;

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

void Generation()
{
    distance = height;
    for (int w = 0; w < width; w++)
    {
        int lowernum = distance - 1;
        int heighernum = distance + 2;
        distance = Random.Range(lowernum, heighernum);
        space = Random.Range(12, 20);
        int stonespace = distance - space;

        for (int j = 0; j < stonespace; j++)
        {
            Instantiate(Stone, new Vector3(w, j), Quaternion.identity);
        }

        for (int j = stonespace; j < distance; j++)
        {
            Instantiate(Dirt, new Vector3(w, j), Quaternion.identity);
        }
        Instantiate(Grass, new Vector3(w, distance), Quaternion.identity);
    }
}

If I understand it correctly you generate a world with stones in a grid. And after that you want to place blocks on some places in the world that does not contain a stone? At least that is how I understand your task.

I suggest that you keep a copy of the grid so you can remember where the stones are, and then just place on empty positions.

const int MAXWIDTH = 30;
const int MAXHEIGHT = 30;
bool[,] aMap;

void Generation()
{
    aMap = new int[MAXWIDTH, MAXHEIGHT];
    for(int w = 0; w < MAXWIDTH; w++)
        for(int h = 0; h < MAXHEIGHT; h++)
            aMap[w, h] = false;
    //...
    for (int w = 0; w < width; w++)
    {
        //...
        for (int j = stonespace; j < distance; j++)
        {
            aMap[w, j] = true; //block placement possible (on dirt)
        }
    }
}

public int numBlocks = 5;
void PlaceBlocks()
{
    int i = 0;
    while(i < numBlocks) 
    {
        int w = Random.Range(0, MAXWIDTH);
        int h = Random.Range(0, MAXHEIGHT;

        if(aMap[w, h]) 
        {
            //TODO place block here
            i++;
        }
    }
}