public void ChangeRandom()
    {
        Mesh clonedMesh = MeshUtility.CloneMesh(originalMesh);

        //set submesh triangles or texture gets all screwed up
        for (int i = 0; i < clonedMesh.subMeshCount; i++)
        {
            clonedMesh.SetTriangles(originalMesh.GetTriangles(i), i);
        }


        //set submesh triangles or texture gets all screwed up
        for (int i = 0; i < clonedMesh.subMeshCount; i++)
        {
            clonedMesh.SetTriangles(originalMesh.GetTriangles(i), i);
        }

        //dont always change just in case it matters
        if (Random.Range(0, 7) < 4)
        {
            //get current verts
            List <Vector3> tempVerts = new List <Vector3>();
            clonedMesh.GetVertices(tempVerts);

            List <Vector3> relatedVerts = tempVerts.GroupBy(x => x)
                                          .Where(g => g.Count() > 1)
                                          .Select(y => y.Key)
                                          .ToList();

            foreach (Vector3 vert in relatedVerts)
            {
                Vector3 currVert = vert;
                currVert.x += Random.Range(0f, range);
                currVert.y += Random.Range(0f, range);
                currVert.z += Random.Range(0f, range);

                //replace all similar verts with updated random position
                for (int i = 0; i < tempVerts.Count; i++)
                {
                    if (tempVerts[i] == vert)
                    {
                        tempVerts[i] = currVert;
                    }
                }
            }
            clonedMesh.SetVertices(tempVerts);
        }

        clonedMesh.RecalculateBounds();
        clonedMesh.RecalculateNormals();
        clonedMesh.RecalculateTangents();
        MeshUtility.SetMesh(transform, clonedMesh);
    }