In general, you should study various circular distributions (for example, vonMises, aka "circular normal distribution").
As a quick example:
import numpy as np
import matplotlib.pyplot as plt
thetas = np.random.vonmises(np.radians(50), 1.5, 100)
x, y = np.zeros_like(thetas), np.zeros_like(thetas)
dx, dy = np.cos(thetas), np.sin(thetas)
fig, ax = plt.subplots()
ax.quiver(x, y, dx, dy, angles='xy', scale_units='xy', scale=1)
ax.set(xlim=[-1, 1], ylim=[-1, 1], aspect=1)
ax.axis('off')
plt.show()

, , , , .
(, std) . "" .
( 2D , 3D):
import numpy as np
import matplotlib.pyplot as plt
bias, num = 1, 100
direction = np.radians(50)
dx, dy = np.random.normal(0, 0.5, (2, num))
dx += bias * np.cos(direction)
dy += bias * np.sin(direction)
fig, ax = plt.subplots()
x, y = np.zeros_like(dx), np.zeros_like(dy)
ax.quiver(x, y, dx, dy, angles='xy', scale_units='xy', scale=1)
ax.set(xlim=[-1, 2], ylim=[-1, 2], aspect=1)
ax.axis('off')
plt.show()

, , , vonMises, theta. :
import numpy as np
import matplotlib.pyplot as plt
bias, num = 1.5, 100
direction = np.radians(50)
thetas = np.random.vonmises(direction, bias, 100)
mag = np.cos(thetas - direction)
x, y = np.zeros_like(thetas), np.zeros_like(thetas)
dx, dy = mag * np.cos(thetas), mag * np.sin(thetas)
fig, ax = plt.subplots()
ax.quiver(x, y, dx, dy, angles='xy', scale_units='xy', scale=1)
ax.set(xlim=[-0.5, 1], ylim=[-0.5, 1], aspect=1)
ax.axis('off')
plt.show()
