How to randomly instantiate cubes that don't overlap?

I have created a C# Script that randomly instantiates a specified amount of cubes inside a specified box collider.

The script works fine, but i dont know how to make the cubes not overlap. I am aware there are many answers on this topic, but I cant work out how to implement them into my script.

using UnityEngine;
using System.Collections;

public class Instantiate : MonoBehaviour {

	[SerializeField]
	private GameObject obj;
	[SerializeField]
	private int NumOfCubes = 10;
	[SerializeField]
	private GameObject SpawnBox;

	private Vector3 SetBoxBoundaries()
	{
		Vector3 LocalPosition;
		BoxCollider Boundaries = SpawnBox.GetComponent<BoxCollider> ();

		float random = Random.value;
		LocalPosition.x = Mathf.Lerp (Boundaries.center.x + SpawnBox.transform.position.x - Boundaries.extents.x * SpawnBox.transform.localScale.x,
		                             Boundaries.center.x + SpawnBox.transform.position.x + Boundaries.extents.x * SpawnBox.transform.localScale.x, random);

		random = Random.value;
		LocalPosition.y = Mathf.Lerp(Boundaries.center.y + SpawnBox.transform.position.y - Boundaries.extents.y * SpawnBox.transform.localScale.y,
		                             Boundaries.center.y + SpawnBox.transform.position.y + Boundaries.extents.y * SpawnBox.transform.localScale.y, random);

		random = Random.value;
		LocalPosition.z = Mathf.Lerp(Boundaries.center.z + SpawnBox.transform.position.z - Boundaries.extents.z * SpawnBox.transform.localScale.z,
		                             Boundaries.center.z + SpawnBox.transform.position.z + Boundaries.extents.z * SpawnBox.transform.localScale.z, random);

		return LocalPosition;
	}

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

	void Generate(int i = 0)
	{
		for(i = 0; i < NumOfCubes; i++)
		{
			Instantiate (obj, SetBoxBoundaries (), Quaternion.identity);
		}
	}
	void Update()
	{
//		Generate ();
	}
}

Does anyone know how to do it?

Thanks

You need to check distance between new position and existings, if it is okay, you can instantiate your object.

using UnityEngine;
using System.Collections;
public class Instantiate : MonoBehaviour
{
  [SerializeField]
  private GameObject obj;
  [SerializeField]
  private int NumOfCubes = 10;
  [SerializeField]
  private GameObject SpawnBox;

  private float sizeOfObj = 1f; // SET THIS
  public List<Vector3> objPositions = new List<Vector3>();

  private Vector3 SetBoxBoundaries()
  {
    Vector3 LocalPosition;
    BoxCollider Boundaries = SpawnBox.GetComponent<BoxCollider> ();
    float random = Random.value;
    LocalPosition.x = Mathf.Lerp (Boundaries.center.x + SpawnBox.transform.position.x - Boundaries.extents.x * SpawnBox.transform.localScale.x,
Boundaries.center.x + SpawnBox.transform.position.x + Boundaries.extents.x * SpawnBox.transform.localScale.x, random);
    random = Random.value;
    LocalPosition.y = Mathf.Lerp(Boundaries.center.y + SpawnBox.transform.position.y - Boundaries.extents.y * SpawnBox.transform.localScale.y,
Boundaries.center.y + SpawnBox.transform.position.y + Boundaries.extents.y * SpawnBox.transform.localScale.y, random);
    random = Random.value;
    LocalPosition.z = Mathf.Lerp(Boundaries.center.z + SpawnBox.transform.position.z - Boundaries.extents.z * SpawnBox.transform.localScale.z,
Boundaries.center.z + SpawnBox.transform.position.z + Boundaries.extents.z * SpawnBox.transform.localScale.z, random);
    if( isAvailable(LocalPosition) )
    {
       objPositions.Add( LocalPosition );
       return LocalPosition;
    }
    else
       return SetBoxBoundaries();
  }

  private bool isAvailable( Vector3 pos )
  {
    for(int i=0; i<objPositions.Count; i++)
    {
      if( Vector3.Distance(pos,objPositions*) < sizeOfObj )*

return false;
}
return true;
}

void Start () {
sizeOfObj = obj.transform.localScale.x; // OR WHATEVER YOU WANT
Generate ();
}
void Generate(int i = 0)
{
for(i = 0; i < NumOfCubes; i++)
{
Instantiate (obj, SetBoxBoundaries (), Quaternion.identity);
}
}
void Update()
{
//Generate ();
}
}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Instantiate : MonoBehaviour {
	[SerializeField]
	private GameObject obj;
	[SerializeField]
	private int NumOfCubes = 10;
	[SerializeField]
	private GameObject SpawnBox;

	public List<Vector3> storeCubeVector = new List<Vector3>();

	
	private Vector3 SetBoxBoundaries()
	{
		Vector3 LocalPosition;
		BoxCollider Boundaries = SpawnBox.GetComponent<BoxCollider> ();
		
		float random = Random.value;
		LocalPosition.x = Mathf.Lerp (Boundaries.center.x + SpawnBox.transform.position.x - Boundaries.extents.x * SpawnBox.transform.localScale.x,
		                              Boundaries.center.x + SpawnBox.transform.position.x + Boundaries.extents.x * SpawnBox.transform.localScale.x, random);
		
		random = Random.value;
		LocalPosition.y = Mathf.Lerp(Boundaries.center.y + SpawnBox.transform.position.y - Boundaries.extents.y * SpawnBox.transform.localScale.y,
		                             Boundaries.center.y + SpawnBox.transform.position.y + Boundaries.extents.y * SpawnBox.transform.localScale.y, random);
		
		random = Random.value;
		LocalPosition.z = Mathf.Lerp(Boundaries.center.z + SpawnBox.transform.position.z - Boundaries.extents.z * SpawnBox.transform.localScale.z,
		                             Boundaries.center.z + SpawnBox.transform.position.z + Boundaries.extents.z * SpawnBox.transform.localScale.z, random);
		


		if(storeCubeVector.Contains(LocalPosition)){
			SetBoxBoundaries();
		}else{
			storeCubeVector.Add(LocalPosition);
		}
		return LocalPosition;


	}
	
	// Use this for initialization
	void Start () {
		Generate ();
	}
	
	void Generate(int i = 0)
	{
		for(i = 0; i < NumOfCubes; i++)
		{
			Instantiate (obj, SetBoxBoundaries (), Quaternion.identity);
		}
	}
	void Update()
	{
		//        Generate ();
	}
}