[C++] 从 0 到 2 亿随机采样(300 个)的最佳实践?

2018-08-27 11:03:45 +08:00
 zynlp
google 了给的结果:
1、先 shuffle 再取前 300 个
2、stl::sample ( only c++17 )

有没有什么其他更好的方法?
3080 次点击
所在节点    C
5 条回复
wutiantong
2018-08-27 11:24:58 +08:00
从 2 亿个数里随机取一个(std::uniform_int_distribution)记为 a1
从(2 亿-1)个数里随机取一个记为 a2,if (a2 >= a1) then (a2 += 1)
从(2 亿-2)个数里随机取一个记为 a3,if (a3 >= max(a1, a2)) then (a3 += 2) elif (a3 >= min(a1, a2)) then (a3 += 1)
依次类推 300 次
geelaw
2018-08-27 11:32:42 +08:00
这个“随机采样”根本没说明白,根据心电感应做题法,你希望从 0 到 2 亿无放回抽样 300 个。

方法 1:你做 300 次有放回抽样,如果有重复就再来一次。这样做期望 1.00224502750272 次可以得到一个有效结果。这个东西的别名叫做 birthday attack。

方法 2:按照 #1 的方法挖洞。
GeruzoniAnsasu
2018-08-27 11:36:49 +08:00
不知道这“最佳实践”最佳在哪个方面

是效率还是随机性还是均匀度还是什么的

可以参考下这个,stl 默认的随机数引擎
https://zh.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
Nirvanada
2018-08-27 14:22:53 +08:00
参考下蓄水池采样
ipwx
2018-08-27 15:17:33 +08:00
我觉得 reject sampling 对这个场景其实还行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/483552

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX