操作数组, 使得其中相同的元素的距离>=k

2021-12-23 11:50:02 +08:00
 icySoda

最近业务上的一个需求. 真实场景是这样, 0-31 一共 32 个数, 给定长度 n, 返回一个长度为 n 的随机数组. 使得:

  1. 以下元素出现的概率为 50%, 0,7,8,15,16,23,24,31
  2. 以下元素出现的概率为 45%: 1~6,25~30, 9,14,17,22
  3. 其他元素出现的概率为 5%: 10~14, 18~21
  4. 数组中相同元素的位置距离>=6

前 3 点很容易满足, 第 4 点没什么思路, 请老师们指教

1463 次点击
所在节点    算法
28 条回复
ipwx
2021-12-23 15:54:46 +08:00
@Mutoo @icySoda 你们说得对,我把一个重采样的丢弃操作放错位置了。

https://ideone.com/fx3OHz

@icySoda 这个就符合条件了。

reject sampling 是有理论证明的,无需怀疑。如果结果不符合,一定是 reject sampling 没写对(滑稽)
ipwx
2021-12-23 15:56:05 +08:00
('accept rate:', 0.6822678583611926)
[0.50017, 0.45079, 0.04904]

接受率在 0.7 左右,比我想的 0.5 要好 hhh
ipwx
2021-12-23 15:57:02 +08:00
@icySoda 另外你的 原问题,14 这个数同时出现在 Group B 和 group C 了。我把它放进 group C 了
GuuJiang
2021-12-23 15:58:04 +08:00
@icySoda 如果你计算生成的结果频率和你期望的不一致,说明你对概率的计算不对,而且我大概能猜到不对在哪,以 5%这组为例,假设你第一次生成了 10 ,那么接下来的 6 次中不可能再有 10 ,但是 11-14 ,18-21 中每个数出现的概率仍然是 5%/8 ,但是你不能再去统计整组的概率,换句话说,前三条规则表面上说的是三个组整体的概率,实际上说的是其中每个元素的概率,拒绝采样保证没有被丢弃的元素的概率不变,但是如果你要让整组的概率仍然维持不变,这和第 4 条是天然相悖的
ipwx
2021-12-23 16:00:45 +08:00
@GuuJiang 21L 我 reject sampling 修正了,22L 是实验结果
icySoda
2021-12-23 17:52:58 +08:00
@ipwx 看了结果, 概率确实大体相近👍🏻

同样的逻辑, 我用 js 的出来的概率就是差很多, 百思不得其解

https://ideone.com/bp66nl
crs0910
2021-12-23 20:58:36 +08:00
@icySoda while true 写错位置了
icySoda
2021-12-23 23:24:16 +08:00
@crs0910 😂

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

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

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

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

© 2021 V2EX