Object instantiates on top of the previous object

I’ve written a script where a level is supposed to be instantiated when my character hits a specific location. It works perfectly the first time it’s meant to instantiate. But on the second time, it instantiates the level directly on top of the previous level.
Here’s a video of whats happening: Unity Instantiate Problem on Vimeo
And here’s the code (It isn’t all of the code, only the code relevant to this question):

if (collision.tag == "Score2")
        {
            scoreText.text = (++score).ToString();
            Destroy(collision.gameObject);
            int randomNumber = Random.Range(0, 2);
            if (randomNumber == 0)
                Instantiate(course[0], new Vector2(-0.39f, -2f + transform.position.z), transform.rotation);
            else
                Instantiate(course[1], new Vector2(-0.39f, -2f + transform.position.z), transform.rotation);
            return;

This is probably an issue with incorrect parenting and positioning. This may be a better approach:

void OnCollisionEnter(Collision other)
{
     if (other.gameObject.tag == "Player")
     {
          //generate next level piece here
     }
}

Alternatively, you can use a trigger and create a trigger box as part of each course which spans the width of the play area. Attach this to each course.

I would deal with this problem by saving the reference of the last instantiated course in a variable, then using its transform to calculate the new position. I’m proposing this solution because your calculation of the next instantiation position seems weird, but feel free to explain to me it if you don’t want to change it, maybe it makes sense. Anyway, I would do something like this:

private float courseHeight;
private GameObject lastInstantiatedCourse;

/* You should initialize the last course variable with the first one instantiated for the start of the game */

void OnCollisionEnter(Collision other)
     {
         if (other.gameObject.tag == "Score2")
         {
             int randomNumber = Random.Range(0, 2);
             if (randomNumber == 0)
             lastInstantiatedCourse = Instantiate(course[0], new Vector2(-0.39f, lastInstantiatedCourse.transform.position.y + courseHeight), transform.rotation);
             else
             lastInstantiatedCourse = Instantiate(course[1], new Vector2(-0.39f, lastInstantiatedCourse.transform.position.y + courseHeight), transform.rotation);
             return;
         }
     }

I did not test it out, but it should work.