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不可少 ,慢点不是坏事
你是高手,我只是说点学习心得.