一直很好奇 leetcode 是怎么判断随机算法的正误的

2022-06-26 13:45:17 +08:00
 eastphoton

比如今天的每日一题: https://leetcode.cn/problems/random-pick-with-blacklist/, 还有这些: https://leetcode.cn/tag/randomized/problemset/

毕竟随机结果没法直接对比标准答案,感觉要判断正误就挺麻烦,但 leetcode 可以测出来正确性。

有时候写出来某个细节差个+1 -1 ,那概率分布也差不太多吧,它也能测出来有错误不给 AC 。 感觉就挺神奇的。

没有搜到有对这个的讨论。。

3061 次点击
所在节点    LeetCode
6 条回复
stein42
2022-06-26 14:59:42 +08:00
应该是用统计学里的假设检验来验证,这里是离散均匀分布,可以用皮尔森卡方检定。
假设检验本身就可能犯第一类错误(拒绝正确结果)和第二类错误(接受错误结果)。
我试过,轻微改变分布还是能通过。

```
import bisect
import random


class Solution:
....def __init__(self, n: int, blacklist: List[int]):
........self.m = n - len(blacklist)
........self.ss = [a - i for i, a in enumerate(sorted(blacklist))]

....def pick(self) -> int:
........r = random.randrange(self.m)
........return r + bisect.bisect_right(self.ss, r)
```

```
import bisect
import random


class Solution:
....def __init__(self, n: int, blacklist: List[int]):
........self.m = n - len(blacklist)
........self.ss = [a - i for i, a in enumerate(sorted(blacklist))]

....def pick(self) -> int:
........if random.random() < 1 / (100 * self.m):
............r = 0
........else:
............r = random.randrange(self.m)
........return r + bisect.bisect_right(self.ss, r)
```
virusdefender
2022-06-26 18:15:27 +08:00
special judge 吧,也就是写一段代码来判断,各种 oj 都有这功能
SingeeKing
2022-06-26 19:13:32 +08:00
咱就说,有没有一种可能,他是跑了你的代码然后检查输入输出
SingeeKing
2022-06-26 19:14:28 +08:00
哦不我看错了,忽略我…
adjusted
2022-06-26 20:14:31 +08:00
random 设置下 seed 吧
wy315700
2022-06-26 20:16:43 +08:00
special judge 写一段代码来检测你的输出的,写 oj 的时候经常用到的,除了随机数算法,一些涉及浮点数的可能也要用到

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

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

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

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

© 2021 V2EX