为什么这种随机生成图的方式不公平?

2023-12-27

我的目标是生成一个由 n 个顶点组成的有向图,使得每个顶点都有一条出边和一条入边。我认为实现此目的的一种方法是将所有顶点放入一个罐中,并让顶点轮流洗牌并拉出条目——例如,如果顶点 1 拉出顶点 3,则意味着将有一条从 1 到 3 的边。如果一个顶点将自己从罐中拉出,它只是将其放回并重新洗牌。如果最后,最后一个顶点发现罐子只包含它自己,那么我们需要重新开始。这是我的 Kotlin 代码:

fun generateGraph(n: Int): Map<Int, Int> {
    val vertices : List<Int> = (1..n).toList()
    while (true) {
        val pot = vertices.toMutableList()
        val result = mutableMapOf<Int, Int>()
        for (vertex in 1 until n) {
            do {
                java.util.Collections.shuffle(pot)
            } while (pot[0] == vertex)
            result.put(vertex, pot.removeAt(0))
        }
        if (pot[0] != n) {
            result.put(n, pot.removeAt(0))
            return result
        }
        else {
            // The last vertex left in the pot is also the last one unassigned.  Try again...
        }
    }
}

似乎有效。然而,在测试时,我发现它显示的一些图表比其他图表多。当 n 为 3 时,唯一有效的图是循环

{1=3, 2=1, 3=2}
{1=2, 2=3, 3=1}

但我发现第一个出现的次数是第二个的两倍:

fun main(args: Array<String>) {    
    val n = 3
    val patternCounts = mutableMapOf<Map<Int, Int>, Int>()
    val trials = 10000
    (1..trials).forEach({
        val graph = generateGraph(n)
        patternCounts[graph] = patternCounts.getOrDefault(graph, 0) + 1
    })
    println(patternCounts)
}

刚刚打印的这一系列

{{1=3, 2=1, 3=2}=6669, {1=2, 2=3, 3=1}=3331}

我缺少什么?还有,有没有办法让这件事变得公平?


不难看出为什么会出现这样的结果。顶点 1 与顶点 3 有一半的时间匹配。如果发生这种情况,则无法拒绝该图,因为仅当最后一个剩余顶点是时才会发生拒绝n(本例中为 3)并且该顶点已被使用。所以一半的时间你会得到 {(1,3), (2,1), (3,2)}。

另一半时间,顶点 1 将与顶点 2 匹配,但在顶点 2 与顶点 1 匹配后,其中一半的情况(即总数的 1/4)将被拒绝。因此 {(1,2), ( 2,3), (3,1)} 将有四分之一的时间被选择。

在剩下的四分之一中,整个过程将被重复,这意味着 {(1,3), (2,1), (3,2)} 将继续被选择两倍的频率。

一种解决方案是,一旦将顶点与其自身匹配,就拒绝整个图。这种情况下,选择之前不需要重新洗牌;仅当图表被拒绝时才重新洗牌。

一般问题是,顶点与其自身匹配的情况并不独立于所有其他选择。因此,仅仅在某些比赛后重新洗牌并在其他比赛后拒绝会导致偏见。

任何比赛结束后拒绝并重新开始可能不是最有效的解决方案,但它会起作用。提高算法效率的一种方法是增量洗牌,而不是进行整个洗牌然后验证它。另一种可能性在参考文献中描述这个问题关于数学堆栈交换 https://math.stackexchange.com/questions/302057/generating-a-random-derangement

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这种随机生成图的方式不公平? 的相关文章

  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 如何使 FirebaseAuth.AuthStateListener 在 Kotlin 中工作?

    class LoginActivity AppCompatActivity private val firebaseAuth FirebaseAuth getInstance private val firebaseAuthListener
  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • d3力定向布局-链接距离优先

    在 d3 中使用力导向布局 如何使链接距离成为优先事项 同时仍然保持良好的图形布局 如果我指定动态链接距离 但保留默认费用 则我的图形距离会因费用函数而发生一些变形 并且不再是准确的距离 但是 如果我删除电荷 图表将如下所示 任何建议表示赞
  • Silverlight 中的图形可视化

    我有一个表示有向图的数据结构 我正在寻找一个好的 Silverlight 可视化 以允许我从一个节点导航到另一个节点 最好带有一些漂亮的动画 有谁知道这种显示有什么好的 UI 控件或框架吗 甚至是来自另一个领域的样本 也许是社交网络 我的图
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • compileReleaseKotlin 失败并出现 java.lang.ClassNotFoundException:com.sun.tools.javac.util.Context

    我正在尝试使用 gradlew 通过终端构建我的 Android 项目 其中包含库模块 在 Android Studio 中 它编译并安装成功 但是当我尝试运行时 gradlew assembleDebug我得到以下堆栈跟踪 Using k
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 动态规划 (DP) 中的重叠子问题是什么?

    为了使动态规划适用 问题必须具有两个关键属性 最优子结构 and 重叠子问题 1 https en wikipedia org wiki Dynamic programming 对于这个问题 我们只关注后一个属性 有各种不同的定义重叠子问题
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出

随机推荐

  • CSS滑动边框

    感谢 codeSpy 我得到了这个 http jsfiddle net p9tBR http jsfiddle net p9tBR 我不知道如何在更改页面时更改蓝线 例如 如果我在第 2 页 我希望蓝线位于 2 而不是 1 的下方 当我在第
  • 同一目录中的两个不同的 Git 存储库

    我想维护两个不同的 git 存储库 存储库应保留在同一根目录中 如何实现 我想要的是 管理两个略有不同的存储库 我可以在同一目录中有两个完全不同的存储库吗 您可以通过在 git 命令本身上添加使用以下两个选项之一来实现此目的 git wor
  • 如何给UITextView实现搜索功能?

    我有40多个观点 各有各的观点UITexView 我想实现一个搜索功能 允许用户跨域搜索UITextViews 实际上 我什至不知道如何实现 1 的搜索功能UITextView 因此我不知道这是否可能 我已经在网上搜索并在这里寻找它 但没有
  • 锯齿状数组类型属性

    假设我有这样的财产 public int MyProperty get set 调用代码可以自由更改数组的值 而且还可以替换数组本身 通过隐藏设置器可以轻松防止这种情况 如下所示 public int MyProperty get priv
  • 用c++例子解释Facade模式?

    我已经与维基百科文章 http en wikipedia org wiki Facade pattern 并且似乎缺少代码示例的 C 版本 如果没有这个我就无法完全理解 Facade 模式 你能用 C 帮我解释一下吗 外观模式 为复杂的子系
  • 如何将标签添加到 Bootstrap 对话框页脚

    需要添加bootstrap页脚上的标签bootstrap3 dialog 根据本教程 http nakupanda github io bootstrap3 dialog 只能在页脚区域添加按钮 BootstrapDialog show t
  • NPM:找不到模块“uuid”

    当我尝试使用 npm 时 我收到此消息 gt npm module js 472 throw err Error Cannot found module uuid at Function Module resolveFilename mod
  • C# 中的多客户端/服务器聊天程序?

    客户将能够一对一和群组聊天 温和的房间 类似于 Skype 我将使用服务器来授权客户端 我的问题是哪个更好 WCF 或 TCPClient StreamReader 和 StreamWriter cheesr 我还没有使用过 WCF 但我可
  • 如何从 Grails 控制器和视图外部引用 Grails 域类字段?

    我有域类 class Child static hasMany toys Toy String name Set toys class Toy static belongsTo owner Child String name 在我的 JSP
  • 根据部分字符串选择数组键

    我有一个数组 在该数组中我有一个数组键 如下所示 show me 160该数组键可能会发生一些变化 因此有时页面可能会加载 并且数组键可能会发生变化show me 120 我想现在可以只字符串匹配数组键直到最后一个 这样我就可以检查最后一个
  • 从其他文档追加子元素

    在我的程序中 我必须创建一些文档创建器 并且我想将创建元素的功能拆分为多个类 每个类将创建一个元素 主要创建者将通过接口提取该元素并将其附加到主体 问题是我不想将任何参数传递给构造函数调用 例如 creator createDocument
  • window.URL.createObjectURL(blob);在我的应用程序中未定义

    我仅在我的应用程序中遇到此问题 与浏览器 IE 和 Chrome 无关 如果我检查window URL createObjectURL blob 在两个浏览器中任何其他页面的控制台中 其工作正常 但它window URL createObj
  • IntelliJ IDEA 在 JPQL 中突出显示带有“无法解析符号”的 @Entity 类名称

    IntelliJ IDEA 在 JPQL 中用红色突出显示持久的 Entity 类名称 无法解析符号 这会分散注意力并埋葬真正的问题 因此 例如 我在存储库中声明一个查询 private static final String READ B
  • Java 石头剪刀布游戏 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是编程新手 我正在尝试用 Java 编写一个非常简单的石头剪刀布游戏 它将编译并运行良好 但我希望说一些类似 无效的移动 再试一次
  • Python ABC 多重继承

    我认为代码比我用文字能更好地解释问题 这是 my abc py 中的代码 from abc import ABCMeta abstractmethod class MyABC object metaclass ABCMeta abstrac
  • 在 bot 目录中注册后,是否可以在 Microsoft Teams 或 Skype 中测试我的 Bot 应用程序但无需发布它?

    我已在 MS Bot 目录中注册了我的机器人应用程序 我可以使用 Bot Framework Emulator 与我的消息端点进行通信 但当我在 MS 团队和 Skype 中尝试同样的操作时 机器人没有回复我的消息 是的 这是可能的 你需要
  • 没有这样的文件来加载 active_record/associations/has_and_belongs_to_many_association

    我在 Gemfile 中添加了composite primary keys gem 在本地环境中它运行良好 但在 centos 机器上它会出现以下错误 在这两个环境中 Ruby 版本为 1 9 2p290 rubygems 版本为 1 3
  • 线段树数组 2 * 2 ^(ceil(log(n))) - 1 的内存如何?

    链接 http www geeksforgeeks org segment tree set 1 sum of given range http www geeksforgeeks org segment tree set 1 sum of
  • bash: ./eclipse: 无法执行二进制文件

    我正在使用 Ubuntu10 10 操作系统 并且我已经下载了 eclipse jee helios SR1 linux gtk x86 64 tar gz 我的电脑是64位机 当我解压 Eclipse 并尝试运行时 eclipse从命令行
  • 为什么这种随机生成图的方式不公平?

    我的目标是生成一个由 n 个顶点组成的有向图 使得每个顶点都有一条出边和一条入边 我认为实现此目的的一种方法是将所有顶点放入一个罐中 并让顶点轮流洗牌并拉出条目 例如 如果顶点 1 拉出顶点 3 则意味着将有一条从 1 到 3 的边 如果一