[![enter image description here][1]][1] A similar answer that utilizes Blender's Mathutils' Vector length property (prevents you from needing to calculate distances in all 3 axes individually): import bpy from random import random from mathutils import Vector cubeRadius = 0.25 maxIterations = 1000 # Max iterations to prevent while loop from running forever # min and max values for each axis for the random numbers ranges = { 'x' : { 'min' : -10, 'max' : 10 }, 'y' : { 'min' : -10, 'max' : 10 }, 'z' : { 'min' : -10, 'max' : 10 } } # Generates a random number within the axis minmax range randLocInRange = lambda axis: ranges[axis]['min'] + random() * ( ranges[axis]['max'] - ranges[axis]['min'] ) size = 250 # Number of cubes cubes = [] # Cube coordinates list loopIterations = 0 while len( cubes ) < size and loopIterations < maxIterations: loopIterations += 1 # Generate a random 3D coordinate loc = Vector([ randLocInRange( axis ) for axis in ranges.keys() ]) if len( cubes ) > 0: # Search for overlapping points (within the cube radius radius) overlappingPoints = [ p for p in cubes if ( p - loc ).length < cubeRadius * 2 ] # if any found, skip this location if overlappingPoints: continue # Add coordinate to cube list cubes.append( loc ) # Add the first cube (others will be duplicated from it) bpy.ops.mesh.primitive_cube_add( radius = cubeRadius, location = cubes[0] ) cube = bpy.context.scene.objects['Cube'] # Add all other cubes for c in cubes[1:]: dupliCube = cube.copy() dupliCube.location = c bpy.context.scene.objects.link( dupliCube ) [1]: https://i.sstatic.net/NzZkm.gif