# Randomization with constant distance between images

Hallo
I’m very very new with Python. I’m using Psychopy for a cognitive task in which same squares appear in a randomly selected position. I need that this squares are not overlapped. How can I say to psychopy :

• chose a random position;
• check if another square is in that position
• if there is another square go back and check again for another position
• if is an empty place: ok put the square.

You can create a `visual.Rect` in a random location, then use the method `overlaps()` to test if it overlaps with another one.

So roughly along the lines of:

``````import numpy as np
stim1 = visual.Rect(win, width=0.1, height=0.1, pos = (np.random.uniform(low=-1, high=1), np.random.uniform(low=-1, high=1)))
stim2 = visual.Rect(win, width=0.1, height=0.1, pos = (np.random.uniform(low=-1, high=1), np.random.uniform(low=-1, high=1)))
while stim2.overlaps(stim1):
stim2.pos = (np.random.uniform(low=-1, high=1), np.random.uniform(low=-1, high=1)
``````

Thank you Jan
I have different condition:

• 2 squares left and 2 right;
• 4 and 4;
• 4 and 2;
• 2 and 4;
does it works even in this case?

I would suggest an alternative approach which will guarantee that your stimuli won’t overlap, without having to create positions and test them iteratively. Make lists of non overlapping x and y coordinates and shuffle them on each routine so you get an apparently random location. e.g.

``````from numpy.random import shuffle

x_coords = [-400, -300, -200, -100, 0, 100, 200, 300, 400]
x_coords = [-400, -300, -200, -100, 0, 100, 200, 300, 400]

for trial in trials:
shuffle(x_coords)
shuffle(y_coords)

some_stimulus.pos = [x_coords[0], y_coords[0])
other_stimulus.pos = [x_coords[1], y_coords[1])
# etc

``````

You could maintain separate lists of coordinates to match your constraints of having some on the left and the right, and so on.

1 Like

I agree that it’d be much better to have a list of places the stimuli could be. The iterative way I posted above is super inefficient and if you have the wrong dimensions on your stimuli, the loop could run forever (always a bad thing!)

2 Likes

You are right. I fixed it. but now I have a new question. I will open a new topic

There are certainly many times where I can’t see any alternative to brute-force iteration to implement randomisation constraints, but it always feels a bit like some sort of defeat

1 Like