首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嗅出有偏随机排列

嗅出有偏随机排列
EN

Code Golf用户
提问于 2022-04-05 03:46:40
回答 1查看 856关注 0票数 14

‘s优秀的工程师们又一次出击了。这一次,他们“革命”了随机排列的产生。“每一项伟大的发明都是简单的”,他们说,他们神奇的新算法如下:

  • 从要排列的数字的列表1,2,3,...,n开始。
  • 对于列表中的每个元素x,在列表中绘制一个随机索引,在随机索引处交换x和元素。

然后,他们“证明”这是无偏的,因为每个元素发生在每个位置的频率相同。

显然,他们的推理是有缺陷的,因为他们的方法具有n^n的可能性,结果通常不是n!的倍数。

您的任务如下:编写一个程序/函数,该程序/函数接受排列的列表/流/生成器/迭代器(在您所选择的语言中最有意义的东西),并决定它们是否是上述算法创建的有偏样本。如果没有,你可以假设样品是无偏的。

n将是3或更多。你可以设定你认为合适的最小样本大小,

您的程序可能错误的小样本,但必须收敛到正确的答案,因为样本的大小增加。

您可以输出True/False或任意两个值(但不包括值组:例如,除非非空列表始终相同,否则不允许空列表与非空列表)。

除此之外,还适用标准规则。

这是代码-高尔夫,最小的函数或程序字节获胜。不同的语言是独立竞争的。

Python 3测试用例生成器

代码语言:javascript
运行
复制
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已经泄露了这只猫的秘密,我看再给几个提示也没什么坏处。

尽管乍一看这似乎是可信的,但元素均匀地分布在各个位置上是不正确的。

我们确实知道:

  1. 当第n个单元被替换为一个随机位置后,n个位置上的单元才是真正的均匀随机。特别是,在最后的状态下,最后的位置是一致随机的。
  2. 在此之前,第n元素保证等于或小于n。
  3. 从位置n到m向下交换的任何东西,只能在第n移动时返回给n。特别是,如果最初的移动是第n次,那就不可能了。
  4. 如果在kth移动后,我们根据它们的期望排列位置,那么m和n只能在第m或第9移动时相互超越。
  5. 选择值:
  • 基(即第一或零)元的位置是一致随机的。这在第一次交换之后仍然有效,从那时起仍然是正确的。
  • 下一个元素在第一个位置中被过度表示:在n^n可能的绘制之外,它发生在(n-1) x n^(n-2) + (n-1)^(n-1)实例中。
  • 最后一个元素在第一个位置中表示不足:在n^n可能的绘制中,它发生在2 x (n-1)^(n-1)实例中。

更多演示/测试代码

5可以用来解决这个挑战,与安德斯的答案类似,但可能稍差一些。

EN

回答 1

Code Golf用户

发布于 2022-04-05 07:42:24

木炭,20字节

代码语言:javascript
运行
复制
›₂⌈Eθ№θι⊕₂∕LθΠ…·¹L⊟θ

在网上试试!链接是详细的代码版本。如果认为排列列表有偏差,则输出-。(测试用例由四个元素的768个有偏排列组成。)解释:

代码语言:javascript
运行
复制
    θ                   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个字节:

代码语言:javascript
运行
复制
‹·⁵¹∕ΣEθ‹§ι⁰⊟ιLθ

在网上试试!链接是详细的代码版本。如果认为排列列表有偏差,则输出-。(测试用例由四个元素的256个有偏排列组成。)

票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/245934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档