如何在Python中生成均匀随机复数

Sad*_*daf 5 python random numpy complex-numbers

对于我的研究,我需要生成均匀的随机复数。如何在 python 中执行此操作,因为没有这样的模块来生成复数。

小智 12

你的问题没有明确说明,你需要说出你想要从复平面的哪个区域绘制均匀分布的数字。对于均匀采样实数,这也是正确的。然而,在实际情况中,有一个非常明显的选择,即区间[0, 1)。例如,您可以看到numpy.random.uniform此间隔中的默认样本。

我将为复杂平面的区域提供一些可能有用的解决方案,但最终,适合您的选择将取决于您的应用程序。

假设npnumpy并且我们想要生成一个由许多这样的形状为 的随机数组成的数组shape

以原点为中心的正方形

即从所有复数 z 中均匀采样,使得实部和虚部都在 [-1,1] 内。您可以生成这样的复数,例如通过

np.random.uniform(-1, 1, shape) + 1.j * np.random.uniform(-1, 1, shape)
Run Code Online (Sandbox Code Playgroud)

以原点为中心的圆盘

即从绝对值在[0,1]之间的所有复数中均匀采样。您可以生成它们,例如

np.sqrt(np.random.uniform(0, 1, shape)) * np.exp(1.j * np.random.uniform(0, 2 * np.pi, shape))
Run Code Online (Sandbox Code Playgroud)

解释:我们可以将圆盘中的点参数化为 z = r * exp(ia)。z在圆盘中的均匀分布意味着角度a在[0, 2pi]范围内均匀,但半径不均匀(直觉:圆盘中半径较大的点比半径小的点多)。半径在区间 [0, 1] 上的概率密度为 p(r) = 2r,CDF(p(r) 的积分)为 F(r) = r^2,逆 CDF 采样允许我们对 X = F^{-1}(Y) = sqrt(Y) 等半径进行采样,其中 Y 均匀分布。


小智 -6

这样做还不够吗:

a = np.random.uniform(1,10,10)
b = a + a * <some constant>j
Run Code Online (Sandbox Code Playgroud)

我认为这保持统一。

array([7.51553061 +9.01863673j, 1.53844779 +1.84613735j,
       2.33666459 +2.80399751j, 9.44081138+11.32897366j,
       7.47316887 +8.96780264j, 6.96193206 +8.35431847j,
       9.13933486+10.96720183j, 2.10023098 +2.52027718j,
       4.70705458 +5.6484655j , 8.02055689 +9.62466827j])
Run Code Online (Sandbox Code Playgroud)