markfang2050 发表于 2020-5-3 09:43:48

普及下什么是高维空间的均匀。假设一个长方形边长a和b不相等,但是用同一个随机函数生成长方形内的坐标( x=a*rand(0,1), y=b*rand(0,1) ),那么在两个方向的一维概率密度分别是1/a和1/b,那么这个长方形内只有单个方向的概率分布是均匀的,但并不是各向均匀,只有a=b时才是真正的均匀,有些人没有分清楚一维均匀和高维均匀的区别。所以,如果在长方形外面外接一个边长为a的正方形(假设a>b),那么先用随机函数在正方形区域内获得各项同性的均匀分布点( x=a*rand(0,1), y=a*rand(0,1) ),各向概率密度为1/a,那么如果我们丢掉在长方形外部的样本,那么在长边方向,总概率还是1,但是短边方向我们丢掉了大约(a-b)/a的样本,总概率变成了1 - (a-b)/a = b/a,而长边的概率密度为1/a,短边的概率密度为(b/a) / b = 1/a,这样才是各向同性均匀,各个方向的线密度相等。

wayne 发表于 2020-5-3 09:52:48

markfang2050 发表于 2020-5-3 09:43
普及下什么是高维空间的均匀。假设一个长方形边长a和b不相等,但是用同一个随机函数生成长方形内的坐标( x ...
"各向均匀" 是谁要求的? 你这是从哪翻出来的 词汇? 经过你给大家的普及,难道按照你的逻辑, 在正方形的区域内,   y=x方向 跟 y=0方向是 同概率分布了? 你说你欠揍不欠揍, 拜托先确认一下 自己的 知识体系 是不是完整的, 靠谱的, 再来教育大家.好不好.

chyanog 发表于 2020-5-3 21:10:06

AbsoluteTiming[
{a, b} = {3, 2};
n = 10^7;
xx = RandomReal[{-a, a}, n]^2;
yy = RandomReal[{-b, b}, n]^2;
B = Unitize;
Total]/Total
]
{0.389281, 1.68323}

markfang2050 发表于 2020-5-3 23:34:36

chyanog 发表于 2020-5-3 21:10
{0.389281, 1.68323}

(*椭圆x^2/4+y^2/9=1中均匀分布的点中随机取一点,求此点到椭圆中心的平均距离*)
AbsoluteTiming[{a, b} = {2, 3};
n = 10^7;
x = RandomReal[{-b, b}, n];
y = RandomReal[{-b, b}, n];
B = Unitize;
Total]/Total]
{1.66658, 1.6835}

zeroieme 发表于 2020-5-4 08:56:05

markfang2050 发表于 2020-5-3 23:34
(*椭圆x^2/4+y^2/9=1中均匀分布的点中随机取一点,求此点到椭圆中心的平均距离*)
AbsoluteTiming[{a, b} ...

说明两个问题,你的机器不如chyanog的,你读不懂chyanog的代码。

dlpg070 发表于 2020-5-4 09:41:40

本帖最后由 dlpg070 于 2020-5-4 09:47 编辑

markfang2050 发表于 2020-5-3 23:34
(*椭圆x^2/4+y^2/9=1中均匀分布的点中随机取一点,求此点到椭圆中心的平均距离*)
AbsoluteTiming[{a, b} ...

比较不同伪随机变量设置的一些计算结果
chyanog 代码(Wayne类似) 和
markfang2050代码
结果有随机性,未做统计分析,大体可见对错优劣
至少markfang2050的伪随机变量设置没有改进


1 chyanog 代码 原题 a=3 b=2
k        a        b        n                理论                实验                理论-实验
1        3        2        100000        1.68338        1.68291        0.000468288
2        3        2        1000000        1.68338        1.68274        0.000635901
3        3        2        10000000        1.68338        1.68361        -0.000235944
4        3        2        100000000        1.68338        1.6833        0.0000720114


2 markfang2050代码 原题 a=2 b=3
k        a        b        n                理论                实验             理论-实验
1        2        3        100000        1.68338        1.67961        0.00376412
2        2        3        1000000        1.68338        1.68397        -0.000590353
3        2        3        10000000        1.68338        1.68317        0.000202304
4        2        3        100000000        1.68338        1.68353        -0.000150837


3 chyanog 代码 大a/b 比较差异
k        a        b        n                理论                实验                理论-实验
1        10        2        100000        4.45847        4.45274        0.00572611
2        10        2        1000000        4.45847        4.45934        -0.000872613
3        10        2        10000000        4.45847        4.45943        -0.000956779
4        10        2        100000000        4.45847        4.45818        0.000289414


4 markfang2050代码 大b/a 比较差异
k        a        b        n                理论                实验                理论-实验
1        2        10        100000        4.45847        4.43848        0.0199884
2        2        10        1000000        4.45847        4.45343        0.00504144
3        2        10        10000000        4.45847        4.46031        -0.00183582
4        2        10        100000000        4.45847        4.45825        0.000219374



hujunhua 发表于 2020-5-6 00:26:19

AbsoluteTiming[
n = 10^7;
square = RandomReal[{-1, 1}, {n, 2}]^2;
disk = Unitize;
Total]/Total@disk
]
仿chyanog写了一个试试。
为什么下面使用Select函数比上面使用Unitize函数要慢得多呢?
AbsoluteTiming[
n = 10^7;
disk =Select^2, Total@#<1&];
Total]/Length@disk
]

dlpg070 发表于 2020-5-6 08:58:58

hujunhua 发表于 2020-5-6 00:26
仿chyanog写了一个试试。
为什么下面使用Select函数比上面使用Unitize函数要慢得多呢?

几个高速代码的计算结果比较,顺序不变
chyanog   :{0.590527,1.68343}
markfang2050:{0.697038,1.68326}
hujunhua1   :{1.12744,1.6833}
hujunhua2:{17.3129,1.68373}

hujunhua 发表于 2020-5-6 10:38:38

dlpg070 发表于 2020-5-6 08:58
几个高速代码的计算结果比较,顺序不变
chyanog   :{0.590527,1.68343}
markfang2050:{0.697038,1.683 ...

把四个程序都运行一遍,再运行第2次时比较结果才是平行的。
否则,由于先运行的程序拥有较大的内存,首次运行时是不平行的。
或者,把各程序的相同的表取为同一个名称,让后运行的覆盖先运行的所占内存,条件应该也是平行的。

我的机子内存4G,对运行先后比较敏感。大内存可忽略。

dlpg070 发表于 2020-5-6 16:18:02

本帖最后由 dlpg070 于 2020-5-6 18:21 编辑

hujunhua 发表于 2020-5-6 10:38
把四个程序都运行一遍,再运行第2次时比较结果才是平行的。
否则,由于先运行的程序拥有较大的内存, ...

我在计算中注意到清理内存,结果与计算顺序关系不大
为公平起见,现在给出另一种计算顺序结果,速度排序不变
按计算先后排序(原代码未改)
hujunhua2   :Wed 6 May 2020 15:44:26 {17.906,1.68384}
hujunhua1   :Wed 6 May 2020 15:44:43 {1.14305,1.6838}
markfang2050:Wed 6 May 2020 15:44:45 {0.783517,1.68346}
chyanog   :Wed 6 May 2020 15:44:45 {0.636677,1.68325}
hujunhua2速度慢一些原因已查明
Select 收集具体信息,disk含有大量信息,占大内存
Unitize 只保留 0 或 1 信息 hu2 disk比 hu1 disk内存大不只十几倍
给出前10个数据例子
hu2 disk
{{{0.286544,0.469867}},{{0.0271882,0.0824672}},{{0.0137024,0.793094}},{{0.110858,0.226014}},{{0.129643,0.558647}},{{0.039617,0.126973}},{{0.0594093,0.173191}},{{0.443257,0.0010602}},{{0.000654596,0.0510836}},{{0.038289,0.0575814}}}
hu1 disk
{{1},{1},{1},{1},{1},{1},{0},{1},{0},{0}}

如果仅仅判断用Unitize当然好
但是如果选取数据Select不可少 ,慢点不是坏事
你是高手,我只是说点学习心得.



页: 1 [2] 3
查看完整版本: 在椭圆x^2/4+y^2/9=1中均匀分布的点中随机取一点,求此点到椭圆中心的平均距离