zoukankan      html  css  js  c++  java
  • 【算法】均匀的生成圆内的随机点

    算法 1

    设半径为$R$。

    $x = r ast cos( heta)$

    $y = r ast sin( heta)$

    其中 $0leqslant r leqslant R$,$t$为0-1均匀分布产生的随机数,$r = sqrt(t) ast R$,$ heta = 2pi ast t, t sim U(0, 1)$ 证明:url

     1 import numpy as np
     2 import random
     3 import math
     4 import matplotlib.pyplot as plt
     5 import matplotlib as mpl
     6 mpl.rcParams['agg.path.chunksize'] = 10000 # the default is 0
     7 N = int(10000)
     8 x1 = 1.5
     9 x2 = 0.5
    10 radius = 2
    11 a = 2 * math.pi * np.array([random.random() for _ in range(N)])
    12 r = np.array([random.random() for _ in range(N)])
    13 x = radius*np.sqrt(r)*np.cos(a) + x1;
    14 y = radius*np.sqrt(r)*np.sin(a) + x2;
    15 plt.scatter(x, y, s=1)
    16 plt.show()

    下面的算法是错误的

    原因在于对$R$求开方,导致$r = sqrt(R)*t$平方后不在满足均匀分布。

     1 import numpy as np
     2 import random
     3 import math
     4 import matplotlib.pyplot as plt
     5 import matplotlib as mpl
     6 mpl.rcParams['agg.path.chunksize'] = 10000 # the default is 0
     7 N = int(10000)
     8 x1 = 1.5
     9 x2 = 0.5
    10 radius = 2
    11 a = 2 * math.pi * np.array([random.random() for _ in range(N)])
    12 r = np.array([random.random() for _ in range(N)])
    13 #x = radius*np.sqrt(r)*np.cos(a) + x1;
    14 #y = radius*np.sqrt(r)*np.sin(a) + x2;
    15 x = np.sqrt(radius)*r*np.cos(a) + x1;
    16 y = np.sqrt(radius)*r*np.sin(a) + x2;
    17 plt.scatter(x, y, s=1)
    18 plt.show()

     参考链接:JustDoIT

  • 相关阅读:
    C# 读取 vCard 格式
    C#自动选择出系统中最合适的IP地址
    WPF专业编程指南
    WPF专业编程指南
    随手复习一下委托:delegate
    迟到的 WPF 学习 —— 控件
    迟到的 WPF 学习 —— 路由事件
    迟到的 WPF 学习 —— 依赖项属性
    迟到的 WPF 学习 —— 布局
    JavaScript 左右上下自动晃动,自动移动。
  • 原文地址:https://www.cnblogs.com/Atanisi/p/8849215.html
Copyright © 2011-2022 走看看