找回密码
 欢迎注册
查看: 1418|回复: 16

[原创] 单位正方形内随机均匀分布N个点,求最近两点的距离的期望值。

[复制链接]
发表于 2024-6-11 16:47:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
单位正方形内随机均匀分布N个点,求最近两点的距离的期望值。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2024-6-11 18:45:30 | 显示全部楼层
“随机均匀”是怎么定义的?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2024-6-11 18:55:36 | 显示全部楼层
N=2的解答如下:

评分

参与人数 1威望 +8 金币 +8 贡献 +8 经验 +8 鲜花 +8 收起 理由
northwolves + 8 + 8 + 8 + 8 + 8 很给力!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
回复 支持 1 反对 0

使用道具 举报

发表于 2024-6-12 09:01:48 | 显示全部楼层
用蒙特卡罗方法运行了一晚上,可以得到如下表所示的数据:
f.png
根据表中数据,当N很大的时候,N个点最小距离的期望值大约是1/(sqrt(2)*(N-2)+2)

程序还在继续运行中,我打算运行1个月后再查看最新结果

#####

1个月的时间到了,最新结果在第12楼
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2024-6-12 09:43:01 | 显示全部楼层
其实是老题目了, 不过改编的是最小距离的期望, 如果是平均距离的期望,那也是有解答的.
https://math.stackexchange.com/q ... square-without-calc
https://mathworld.wolfram.com/SquareLinePicking.html
https://en.wikipedia.org/wiki/Me ... uare_and_rectangles
我先无脑 开满 多线程 蒙特卡洛模拟一波. 5秒钟 模拟$10^7$次.
$2$个点的,是$0.521489$,
  1. pool=ParallelTable[Min[EuclideanDistance@@@Subsets[RandomPoint[Rectangle[],2],{2}]],10^7];Mean[pool]
复制代码

$3$个点的,是$0.305585$
  1. pool=ParallelTable[Min[EuclideanDistance@@@Subsets[RandomPoint[Rectangle[],3],{2}]],10^7];Mean[pool]
复制代码

$4$个点的,是$0.211727$  
跟fans的基本相同,
那我就干脆 略了...

点评

咋啦。 要不 一起 来玩玩Mathematica, ^_^  发表于 2024-6-12 17:06
低级语言自然要多写几行的……换个好点的语言,比如R,能写得更短:mean(sapply(1:1e5,function(x)min(dist(matrix(runif(8),,2)))))(但跑多久就不能控制了)  发表于 2024-6-12 14:54
我用了44行代码求解的问题,没想到你只用了1行代码就解决了  发表于 2024-6-12 12:26
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2024-6-13 19:48:45 | 显示全部楼层
rust 30行代码。
  1. use std::time::SystemTime;
  2. use rand::Rng;

  3. fn main() {
  4.     let epoch = SystemTime::now();
  5.     let mut rng = rand::thread_rng();

  6.     for len in 2..=20{
  7.         let mut pool = vec![0f64; 2*len];
  8.         let mut sol = 0f64;
  9.         for n in 1..=1000000 {
  10.             for i in 0..2*len{
  11.                 pool[i] = rng.gen::<f64>();
  12.             }
  13.             let mut tmp = std::f64::MAX;
  14.             for i in 0..len{
  15.                 for j in i+1..len{
  16.                     let dx = pool[2*i]-pool[2*j];
  17.                     let dy = pool[2*i+1]-pool[2*j+1];
  18.                     let d = (dx*dx+dy*dy).sqrt();
  19.                     if d<tmp{
  20.                         tmp = d;
  21.                     }
  22.                 }
  23.             }
  24.             sol += (tmp-sol)/(n as f64);
  25.         }
  26.         println!("{:?}\t{:>2}: {:>}",SystemTime::now().duration_since(epoch).unwrap(), len,sol);
  27.     }
  28. }
复制代码

  1. 18.07081886s     2: 0.5214912191455748
  2. 45.97656493s     3: 0.305557455784975
  3. 84.044407247s    4: 0.2117282517252658
  4. 132.5894282s     5: 0.16236415849598956
  5. 192.371464127s   6: 0.1318543904439271
  6. 263.58566402s    7: 0.11101626645855782
  7. 346.481123341s   8: 0.09591456840176349
  8. 441.712758225s   9: 0.08439559935297665
  9. 549.852933781s  10: 0.0753744652101195
  10. 670.159919181s  11: 0.06811189075539963
  11. 803.926296491s  12: 0.062114209340580664
  12. 951.673796245s  13: 0.057053982004033256
  13. 1113.986331777s 14: 0.05281346572185144
  14. 2213.947713721s 15: 0.0491372395672005
  15. 2408.412530057s 16: 0.04593105254462259
  16. 2621.344841917s 17: 0.04313378971583958
  17. 2852.501608678s 18: 0.04066015874433873
  18. 3100.381144134s 19: 0.038448076593099435
  19. 3365.935709113s 20: 0.03645890976464638
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2024-6-14 11:07:23 | 显示全部楼层
本帖最后由 hawkzmy 于 2024-6-14 11:18 编辑

最小距离的期望值,不是平均距离。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-6-14 11:10:44 | 显示全部楼层
本帖最后由 hawkzmy 于 2024-6-14 11:21 编辑

有没有解析解?

点评

1/(sqrt(2)*(N-2)+2)  发表于 2024-6-14 11:36
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2024-6-14 11:13:54 | 显示全部楼层
aimisiyou 发表于 2024-6-11 18:45
“随机均匀”是怎么定义的?

均匀分布就是:不是泊松分布、不是正态分布等等,是均匀的分布,平均每个地方的点一样多。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2024-6-14 16:27:47 | 显示全部楼层
KeyTo9_Fans 发表于 2024-6-12 09:01
用蒙特卡罗方法运行了一晚上,可以得到如下表所示的数据:

根据表中数据,当N很大的时候,N个点最小距离的 ...

这是经验公式还是计算结果?

点评

这是近似公式,就好比你问我n的阶乘等于多少,我回答n的阶乘等于sqrt(2*pi*n)*(n/e)^n一样  发表于 2024-6-14 18:20
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-10-11 07:24 , Processed in 0.027539 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表