#input
M, N, x = 100,9,3
mat = np.full((M, N), fill_value=False)
#solution
mat[np.repeat(np.arange(M), x), np.ravel([np.random.permutation(N)[:x] for i in range(M)])]=True
Output:
array([[False,  True,  True, False, False, False, False, False,  True],
   [ True,  True, False,  True, False, False, False, False, False],
   [False,  True, False, False, False, False,  True, False,  True],
   [ True,  True, False,  True, False, False, False, False, False],
   [False, False, False,  True, False, False,  True, False,  True],
   [False,  True, False,  True, False,  True, False, False, False],
   [False, False, False,  True, False,  True,  True, False, False],
   [ True, False, False, False, False,  True,  True, False, False],
   [ True, False, False,  True,  True, False, False, False, False],
   [ True, False, False, False, False, False,  True,  True, False],
   [ True,  True, False, False, False,  True, False, False, False],
   [ True,  True, False, False, False, False,  True, False, False],
   [ True, False,  True, False, False, False, False,  True, False],
   [False, False, False, False, False,  True,  True,  True, False],
   [False, False,  True,  True, False,  True, False, False, False],
   [False, False, False,  True, False,  True,  True, False, False],
   [False,  True, False,  True, False, False, False, False,  True],
   [False, False, False, False,  True,  True, False,  True, False],
   [False, False, False, False, False,  True,  True, False,  True],
   [ True, False,  True, False, False, False, False, False,  True],
   [False,  True, False, False, False, False, False,  True,  True],
   [ True, False, False, False, False,  True, False,  True, False],
   [False, False,  True, False, False, False, False,  True,  True],
   [ True, False, False, False, False,  True,  True, False, False],
   [ True,  True, False, False, False, False, False,  True, False],
   [False, False, False,  True, False, False,  True, False,  True],
   [False, False,  True,  True, False, False, False,  True, False],
   [False, False, False, False, False,  True, False,  True,  True],
   [False, False, False, False,  True,  True, False, False,  True],
   [False, False,  True, False, False,  True, False,  True, False],
   [False,  True, False, False,  True,  True, False, False, False],
   [False, False,  True,  True, False, False,  True, False, False],
   [False, False, False,  True, False,  True, False,  True, False],
   [ True, False, False, False, False, False,  True,  True, False],
   [False,  True, False, False,  True, False, False, False,  True],
   [False, False, False,  True, False, False, False,  True,  True],
   [False, False,  True, False,  True,  True, False, False, False],
   [False,  True,  True, False, False, False, False, False,  True],
   [False, False,  True,  True, False, False,  True, False, False],
   [False, False, False,  True, False,  True,  True, False, False],
   [False,  True,  True, False, False, False, False, False,  True],
   [False, False,  True, False, False,  True, False,  True, False],
   [False,  True, False, False,  True, False,  True, False, False],
   [False,  True, False, False, False, False, False,  True,  True],
   [False, False, False,  True, False, False, False,  True,  True],
   [ True, False, False,  True,  True, False, False, False, False],
   [False, False, False,  True, False,  True, False, False,  True],
   [False, False,  True, False,  True, False,  True, False, False],
   [ True, False, False, False, False, False,  True, False,  True],
   [ True,  True, False, False, False,  True, False, False, False],
   [False, False,  True,  True, False, False,  True, False, False],
   [False, False,  True,  True,  True, False, False, False, False],
   [False, False,  True, False,  True, False, False, False,  True],
   [False, False,  True, False, False,  True,  True, False, False],
   [ True, False, False,  True, False,  True, False, False, False],
   [ True, False, False, False,  True, False, False,  True, False],
   [False,  True,  True, False, False, False,  True, False, False],
   [False, False, False, False, False, False,  True,  True,  True],
   [ True, False,  True, False, False, False,  True, False, False],
   [False,  True,  True, False, False, False, False,  True, False],
   [False,  True, False,  True, False, False, False,  True, False],
   [False,  True, False,  True,  True, False, False, False, False],
   [ True, False, False, False, False, False,  True,  True, False],
   [ True, False,  True, False, False, False,  True, False, False],
   [False, False,  True, False, False, False,  True,  True, False],
   [False, False, False, False, False,  True, False,  True,  True],
   [False, False, False, False, False,  True,  True,  True, False],
   [False, False, False, False, False,  True,  True,  True, False],
   [ True,  True, False, False,  True, False, False, False, False],
   [ True, False,  True, False, False, False,  True, False, False],
   [False, False, False, False, False, False,  True,  True,  True],
   [False,  True, False, False,  True,  True, False, False, False],
   [False,  True, False,  True, False, False, False,  True, False],
   [False, False, False, False,  True,  True, False, False,  True],
   [ True,  True, False, False, False, False,  True, False, False],
   [False,  True, False, False,  True, False, False,  True, False],
   [False, False,  True,  True, False,  True, False, False, False],
   [False,  True, False,  True, False,  True, False, False, False],
   [False, False, False,  True, False,  True, False, False,  True],
   [ True, False, False, False, False, False,  True, False,  True],
   [False, False, False,  True, False, False,  True,  True, False],
   [False, False, False, False,  True,  True,  True, False, False],
   [False, False, False,  True, False, False, False,  True,  True],
   [False,  True, False, False, False,  True,  True, False, False],
   [False, False, False,  True, False,  True, False,  True, False],
   [False,  True, False, False,  True, False, False,  True, False],
   [False,  True, False, False,  True, False, False, False,  True],
   [False, False, False, False, False,  True, False,  True,  True],
   [ True, False, False, False,  True, False, False,  True, False],
   [ True, False,  True, False, False,  True, False, False, False],
   [False, False,  True, False, False, False,  True, False,  True],
   [False, False,  True,  True, False,  True, False, False, False],
   [False, False, False, False,  True,  True,  True, False, False],
   [False, False, False, False,  True, False, False,  True,  True],
   [False, False, False, False,  True, False,  True, False,  True],
   [False,  True,  True,  True, False, False, False, False, False],
   [ True, False, False, False, False,  True, False, False,  True],
   [ True,  True, False,  True, False, False, False, False, False],
   [ True, False, False, False,  True, False, False, False,  True],
   [ True, False, False,  True,  True, False, False, False, False]])
The time required in my machine is 0.002034902572631836 seconds, vs your solution that requires 0.0050237178802490234
#check the results
(mat.sum(1)==3).all() #True
mat.sum(0) #array([34, 30, 33, 46, 23, 35, 36, 31, 32])