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日

相关文章

  • 如何将 python 包安装到 /usr/local/bin?

    【问题标题】:How do I install a python package to /usr/local/bin?如何将 python 包安装到 /usr/local/bin? 【发布时间】:2023-04-03 15:48:01 【问题描述】: 我正在尝试在我的 ubuntu 上安装一个 python 包。我正在尝试通过我编写的安装脚本安装它。setu…

    Python开发 2023年4月8日
    00
  • Python爬虫实现(伪)球迷速成

    Python爬虫实现(伪)球迷速成 前言 随着互联网和数码科技的发展,越来越多的人开始使用网络了解和观看体育比赛。如果你想成为一名(伪)球迷,了解更多的比赛信息和球队积分情况是必要的。本文将介绍如何使用Python爬虫技术来获取体育赛事数据,帮助你更好地了解各个联赛和球队的情况。 准备工作 首先,我们需要准备Python环境和相关的爬虫库。Python 3.…

    python 2023年6月3日
    00
  • python async with和async for的使用

    一、介绍 async with 和 async for 是在 Python 3.5 中引入的两个新的语法特性。它们可以帮助我们更容易地在 asyncio 应用程序中使用协程来处理异步代码。async with 和 async for 是 async with 和 async for 语句的两种形式。 async with 可以用于启动和停止异步上下文管理器,…

    python 2023年6月3日
    00
  • python字典setdefault方法和get方法使用实例

    当使用字典时,有时需要对不存在的键进行操作,这时候使用 get 方法可能会出现问题, 为了防止出错,可以使用 setdefault 方法。 setdefault方法 setdefault 方法用于在字典中设置键的默认值。如果键不存在,则添加该键并将其值设置为指定的默认值,默认值是 None。 setdefault 方法的语法如下: dict.setdefau…

    python 2023年5月13日
    00
  • python中的反斜杠问题深入讲解

    下面就给出一份 Python 中的反斜杠问题深入讲解攻略。 什么是反斜杠? 在计算机编程中,反斜杠(\)是一个特殊字符,通常用于转义(escape)被视为普通字符的字符。我们可以在字符串(string)中使用反斜杠来表示非打印字符、一些保留字符或其他特殊意义字符,这就是转义(escape)序列。 例如,我们可以使用反斜杠字符来在字符串中插入单引号或双引号,或…

    python 2023年6月3日
    00
  • python中time库使用详解

    下面是详细讲解“python中time库使用详解”的完整攻略: 概述 time库是Python标准库中用于表示时间的模块,提供了与时间相关的各种操作和函数。本文将介绍time库的各种用法,包括获取当前时间、时间的格式化、时间的转换等。 获取当前时间 time库提供了获取当前时间的函数time(),它返回从1970年1月1日零时整到现在的秒数。下面是一个示例:…

    python 2023年6月2日
    00
  • Python插入Elasticsearch操作方法解析

    Python插入Elasticsearch操作方法解析 Elasticsearch是一个开源的分布式搜索引擎,可以用于全文搜索、日志分析、数据分析等。本文将详细讲解Python插入Elasticsearch的操作方法,包括连接Elasticsearch、创建索引、插入数据等内容,并提供两个示例。 示例1:连接Elasticsearch 以下是一个使用Pyth…

    python 2023年5月15日
    00
  • Python字符串格式化常用手段及注意事项

    Python字符串格式化是Python中常见的操作之一。通过字符串格式化,可以将多个值按照一定的格式以字符串的形式输出。下面是Python字符串格式化的常用手段和注意事项。 格式化字符串 Python提供了多种方式格式化字符串,主要有两种: 使用百分号(%)方式 可以使用百分号(%)来格式化一个字符串。如下所示: name = ‘Alice’ age = 2…

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