Python随机生成均匀分布在单位圆内的点代码示例

生成均匀分布在单位圆内的点是一道常见的算法题,下面是示例代码和详细攻略。

生成均匀分布在单位圆内的点

要生成均匀分布在单位圆内的点,可以使用下面的方法。

  1. 先生成均匀分布在正方形区域内的点。

  2. 然后筛选出在单位圆内的点。

步骤1可以通过调用Python自带的random模块实现,以平面直角坐标系为例,代码如下:

import random

def generate_points(n):
    """生成n个均匀分布在正方形区域内的点"""
    points = []
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        points.append((x, y))
    return points

上述代码中,random.uniform(a, b)函数用于生成a到b之间的均匀分布的随机数。通过调用该函数生成点的x、y坐标,将其作为元组(x, y)加入到列表中,最终返回生成的点列表。

步骤2可以通过判断点是否在单位圆内实现,圆心为坐标系原点,半径为1。如果点$(x,y)$在单位圆内,则满足$x^2+y^2\le1$,代码如下:

def filter_points(points):
    """筛选出在单位圆内的点"""
    filtered_points = []
    for x, y in points:
        if x ** 2 + y ** 2 <= 1:
            filtered_points.append((x, y))
    return filtered_points

上述代码中,points为步骤1生成的所有点的列表,filtered_points为筛选后的在单位圆内的点的列表。如果点满足$x^2+y^2\le1$这个条件,则将其加入到filtered_points列表中。

至此,我们就完成了生成均匀分布在单位圆内的点,完整代码如下:

import random

def generate_points(n):
    """生成n个均匀分布在正方形区域内的点"""
    points = []
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        points.append((x, y))
    return points

def filter_points(points):
    """筛选出在单位圆内的点"""
    filtered_points = []
    for x, y in points:
        if x ** 2 + y ** 2 <= 1:
            filtered_points.append((x, y))
    return filtered_points

n = 1000  # 生成1000个点
points = generate_points(n)
filtered_points = filter_points(points)

print(f"生成的点数:{len(points)}")
print(f"筛选后的点数:{len(filtered_points)}")

输出结果为:

生成的点数:1000
筛选后的点数:791

可以看到,生成的点数为1000,经过筛选后在单位圆内的点数为791,接近于理论上的分布数量,从而实现了随机生成均匀分布在单位圆内的点。

示例说明

示例1

若要生成1万个均匀分布在单位圆内的点,可以设置n = 10000,再按照上述方法得到结果。

import random

def generate_points(n):
    """生成n个均匀分布在正方形区域内的点"""
    points = []
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        points.append((x, y))
    return points

def filter_points(points):
    """筛选出在单位圆内的点"""
    filtered_points = []
    for x, y in points:
        if x ** 2 + y ** 2 <= 1:
            filtered_points.append((x, y))
    return filtered_points

n = 10000  # 生成10000个点
points = generate_points(n)
filtered_points = filter_points(points)

print(f"生成的点数:{len(points)}")
print(f"筛选后的点数:{len(filtered_points)}")

输出结果为:

生成的点数:10000
筛选后的点数:7878

可以看到,生成的点数为10000,筛选后在单位圆内的点数为7878,接近于理论上的分布数量,从而实现了随机生成均匀分布在单位圆内的1万个点。

示例2

若要生成均匀分布在单位球面内的100个点,可以在步骤1中生成均匀分布在正方体区域内的点,然后在步骤2中筛选出在单位球面内的点。

首先生成均匀分布在正方体区域内的代码如下:

import random

def generate_points(n):
    """生成n个均匀分布在正方体区域内的点"""
    points = []
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        z = random.uniform(-1, 1)
        points.append((x, y, z))
    return points

生成的点中,概率不再均匀分布,因此可以使用接下来的算法实现筛选。

其次筛选出在单位球面内的点,代码如下:

import math

def filter_points(points):
    """筛选出在单位球面内的点"""
    filtered_points = []
    for x, y, z in points:
        if x ** 2 + y ** 2 + z ** 2 <= 1:
            filtered_points.append((x, y, z))
    return filtered_points

上述代码中,x ** 2 + y ** 2 + z ** 2 <= 1表示点$(x,y,z)$距离坐标系原点的距离小于等于1,从而满足在单位球面内的条件。

将两段代码组合得到完整代码:

import random
import math

def generate_points(n):
    """生成n个均匀分布在正方体区域内的点"""
    points = []
    for i in range(n):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        z = random.uniform(-1, 1)
        points.append((x, y, z))
    return points

def filter_points(points):
    """筛选出在单位球面内的点"""
    filtered_points = []
    for x, y, z in points:
        if x ** 2 + y ** 2 + z ** 2 <= 1:
            filtered_points.append((x, y, z))
    return filtered_points

n = 100  # 生成100个点
points = generate_points(n)
filtered_points = filter_points(points)

print(f"生成的点数:{len(points)}")
print(f"筛选后的点数:{len(filtered_points)}")

输出结果为:

生成的点数:100
筛选后的点数:66

可以看到,生成的点数为100,筛选后在单位球面内的点数为66,接近于理论上的分布数量,从而实现了随机生成均匀分布在单位球面内的100个点。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python随机生成均匀分布在单位圆内的点代码示例 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 详解python3中zipfile模块用法

    详解Python3中zipfile模块用法 zipfile是Python标准库中的一个模块,用于读取和写入ZIP格式的压缩文件。本文将详细讲解zipfile模块的用法,包括创建ZIP文件、读取ZIP文件、解压ZIP文件等内容,并提供两个示例。 示例1:创建ZIP文件 以下是一个使用zipfile创建ZIP文件的示例: import zipfile with …

    python 2023年5月15日
    00
  • Python socket如何解析HTTP请求内容

    Python中的socket库可以用于创建网络应用程序,包括HTTP服务器和客户端。在HTTP服务器中,我们需要解析HTTP请求内容,以便正确地处理请求并生成响应。以下是Python socket如何解析HTTP请求内容的完整攻略,包含两个示例。 示例1:解析GET请求 以下是一个示例,可以使用Python socket解析GET请求: import soc…

    python 2023年5月15日
    00
  • python RC4加密操作示例【测试可用】

    pythonRC4加密操作示例【测试可用】 本文将为您介绍如何使用Python中的RC4加密算法对数据进行加密和解密。 什么是RC4算法 RC4算法是一种流加密算法,它可以对数据流进行加密和解密。RC4算法的核心原理是使用一个密钥对明文进行加密,其中密钥长度可以是1到256字节。 安装依赖包 在使用RC4加密算法之前,需要先安装Python的Crypto库。…

    python 2023年5月13日
    00
  • Python多线程实现支付模拟请求过程解析

    Python多线程实现支付模拟请求过程解析 在Python中,我们可以使用多线程来实现并发。本文将介绍如何使用Python多线程实现支付模拟请求过程,并提供两个示例代码。 步骤1:导入必要的库 在使用多线程实现支付模拟请求之前,我们需要先导入必要的库: import threading import requests import time 在上面的示例中,…

    python 2023年5月15日
    00
  • Python Tkinter Canvas画布控件详解

    Python Tkinter Canvas是一个非常强大的绘图工具,能够让用户轻松创建图形界面应用程序。下面我们来详细探讨一下Tkinter Canvas画布控件的详细使用方法。 Canvas的基本使用 Canvas是用于绘制图形的画布控件,在程序中引用如下: from tkinter import * root = Tk() canvas = Canvas…

    python 2023年6月13日
    00
  • Python中re模块的元字符使用小结

    当我们在使用 Python 处理字符串时,re 模块的强大就显现出来了,使用正则表达式来匹配符合特定条件的字符串变得异常简单。下面我将对 Python 中的 re 模块的元字符做一个小结,希望对您有所帮助。 re 模块的元字符使用小结 re 模块 re 模块是 Python 用于正则表达式操作的模块,它提供了处理正则表达式的各种函数,包括模式匹配和替换等操作…

    python 2023年5月14日
    00
  • Python打印scrapy蜘蛛抓取树结构的方法

    下面是关于「Python打印Scrapy蜘蛛抓取树结构的方法」的完整攻略。 背景 Scrapy 是一个流行的网络爬虫框架,常用于爬取互联网上的数据。在编写 Scrapy 蜘蛛时,有时需要查看抓取下来的数据的结构,方便调试和数据分析。本文将分享一些可以用于打印 Scrapy 蜘蛛抓取树结构的方法,希望对使用 Scrapy 的开发者有所帮助。 打印 Scrapy…

    python 2023年6月3日
    00
  • Python线程指南详细介绍

    Python线程指南详细介绍 Python是一种支持多线程编程的高级编程语言,其线程库提供了灵活易用且强大的线程管理方式,使得并发编程变得相对容易。在这篇文章中,我们将会详细介绍Python线程的使用方法和注意事项。 线程的创建 Python中的线程是通过threading模块来实现的。要创建一个线程,只需创建一个Thread对象,并传递一个可调用对象(如函…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部