spawn a powerup in 2D platformer c#

This is my first project so please bear with me.
I’ve managed to create a scene which works pretty well - it has floor, player, collisions, physics and some mechanics for decreasing health.

My problem stems from a powerup/powerdown mechanic. I have :
1 prefab (a question mark) which applies a random powerup/powerdown to the player.
When player collides, it applies the affect for 5 secs. I have tested this code and works well (using switch statement for random affect).

I have looked everywhere and cannot find a good example to achieve my last part. This is to:

Spawn the prefab x number of times throughout the level just above the floor (floor is rectangle collider). The X position can be anything, but the Y value needs to be just above the floor.
I need the powerup/down prefab to not overlap anything (including itself) and it needs to be random - i.e. not using a hidden game object for spawn points.

The floor is on it’s own layer which I thought could assist me … psedo code I thought:

if (spawnpoint above floor_layer)
instantiate (powerup, random.range.x, floor_layer.y)

Any advice would be greatly appreciated on this. I looked at raycasting (haven’t really been successful in implementing raycasting though), manual spawn points (not what I prefer).

End result should look like:

  1. player starts level
  2. as player runs through, powerups/downs appear throughout the level at ground level.
  3. my powerup script destroys prefab after applying affect - should remain destroyed.

using UnityEngine;
using System.Collections;

public class SpawnPowerUps : MonoBehaviour
{

    public int numberOfPowerUps = 10;       // How many power ups to spawn
    public float minXSpawn = 0f;            // The min x position that power ups can spawn
    public float maxXSpawn = 10f;           // The max x position that power ups can spawn
    public float ySpawn = 1f;               // The y position that all power ups will spawn
    public GameObject powerUpPrefab;        // The prefab of the power up to be spawned

    void Start()
    {
        // Run code numberOfPowerUps amount of times
        for (int i = 0; i < numberOfPowerUps; i++)
        {
            // Generate a random number between minXSpawn and maxXSpawn
            float randomX = Random.Range(minXSpawn, maxXSpawn);


            Vector2 spawnPosition = Vector2.zero;       // Create a variable to store the spawn position being generated
            spawnPosition.x = randomX;                  // Assign x to be our random x value
            spawnPosition.y = ySpawn;                   // Assign y to our desired y position

            // Instantiate our powerup at the spawn position with a default rotation
            Instantiate(powerUpPrefab, spawnPosition, Quaternion.identity);
        }
    }

This won’t solve the power ups not spawning on each other, but it does all the other stuff you want.