Is there a better way to generate random numbers?

I have 9 spawn points (suppose they’re called Point0, Point1,… Point8). The x position of each spawn point is set 0.5 units to the right of the previous spawn point (x position of Point0 is -2, x position of Point1 is -1.5, x position of Point2 is -1 etc). All spawn points are placed in an array (Point0 at index 0, Point 1 at index 1, etc).

My intention is to randomly select a spawn point and spawn an object at that point. I initially used Unity Random.Range function like so:

spawnPointIndex = Random.Range(0, spawnPointsArray.Length);
//And then I spawn the object at spawnPointsArray[spawnPointIndex]

However, I noticed that every now and then, the same spawnPointIndex was generated twice or thrice in a row. This is bad random behavior. So I made a modification:

int prevSpawnIndex = -1 //this is a global variable

   spawnPointIndex = Random.Range(0, spawnPointsArray.Length);
} while (prevSpawnIndex == spawnPointIndex);

And then it worked…kinda. Although the same spawnPointIndex is no longer generated more than once in a row, there is still a flaw. Every now and then, the spawnPointIndex variable creates a pattern like this: 0, 2, 4, 6. Sometimes, the generated values for spawnPointIndex may even follow this order:
8, 7, 4, 3… In other words, the Random.Range function causes the spawnPointIndex to keep increasing too many times, or keep decreasing too many times. It doesn’t seem random enough. And this occasionally causes some extreme situations for the player, where it becomes almost impossible for the player to progress. Here’s an example:

The way the game works is that the platforms keep rising upwards and the player (the green ball) must always land on the yellow platforms. If the ball lands on a red platform or if the player hits the spikes, then the player loses. You can see in the picture that the player is stuck in a situation where the ball can’t really land on a yellow platform safely. The movement of the ball is physics-based and that makes it very hard for the player to ensure that the ball will safely land on one of the yellow platforms.

So I was hoping there would be a better way to create random behaviour so that these sort of scenarios could be avoided.

I made a similar game (‘Jumpkin’ in the asset store, please check it out… and had a similar problem.
in the end I gave up on totally random, and instead figured out patterns of nice layouts that worked, then I made a list of these (hand made) then randomized how those fit together.
So basically I built layers, or short sections that could all fit next to each other… with difficulty ratings per section, for player progression… then I grouped them together randomly (also based on distance vs difficulty) (using the same random seed each time, if you want a level to remain the same layout)

Another idea (hacky but maybe simpler) would be to do 3 or so Random.Range calls and Choose afterwards the one that fits best, following some rules that need to be defined