‘s优秀的工程师们又一次出击了。这一次,他们“革命”了随机排列的产生。“每一项伟大的发明都是简单的”,他们说,他们神奇的新算法如下:
1,2,3,...,n
开始。然后,他们“证明”这是无偏的,因为每个元素发生在每个位置的频率相同。
显然,他们的推理是有缺陷的,因为他们的方法具有n^n
的可能性,结果通常不是n!
的倍数。
您的任务如下:编写一个程序/函数,该程序/函数接受排列的列表/流/生成器/迭代器(在您所选择的语言中最有意义的东西),并决定它们是否是上述算法创建的有偏样本。如果没有,你可以假设样品是无偏的。
n
将是3
或更多。你可以设定你认为合适的最小样本大小,
您的程序可能错误的小样本,但必须收敛到正确的答案,因为样本的大小增加。
您可以输出True/False或任意两个值(但不包括值组:例如,除非非空列表始终相同,否则不允许空列表与非空列表)。
除此之外,还适用标准规则。
这是代码-高尔夫,最小的函数或程序字节获胜。不同的语言是独立竞争的。
import random
def f(n,biased=True,repeats=10,one_based=False):
OUT = []
for c in range(repeats):
out = [*range(one_based,n+one_based)]
OUT.append(out)
for i in range(n):
o = random.randint(i-i*biased,n-1)
out[o],out[i] = out[i],out[o]
return OUT
既然@AndersKaseorg已经泄露了这只猫的秘密,我看再给几个提示也没什么坏处。
尽管乍一看这似乎是可信的,但元素均匀地分布在各个位置上是不正确的。
我们确实知道:
n^n
可能的绘制之外,它发生在(n-1) x n^(n-2) + (n-1)^(n-1)
实例中。n^n
可能的绘制中,它发生在2 x (n-1)^(n-1)
实例中。5可以用来解决这个挑战,与安德斯的答案类似,但可能稍差一些。
发布于 2022-04-05 07:42:24
›₂⌈Eθ№θι⊕₂∕LθΠ…·¹L⊟θ
在网上试试!链接是详细的代码版本。如果认为排列列表有偏差,则输出-
。(测试用例由四个元素的768个有偏排列组成。)解释:
θ Input list
E Map over elements
№ Count of
ι Current element
θ In input list
⌈ Maximum
₂ Square root
› Is greater than
θ Input list
L Length
∕ Divided by
θ Input list
⊟ Last element
L Length
Π…·¹ Factorial
₂ Square root
⊕ Incremented
› Implicitly print
@AndersKaesorg的一个端口将只有16个字节:
‹·⁵¹∕ΣEθ‹§ι⁰⊟ιLθ
在网上试试!链接是详细的代码版本。如果认为排列列表有偏差,则输出-
。(测试用例由四个元素的256个有偏排列组成。)
https://codegolf.stackexchange.com/questions/245934
复制相似问题