如何在不存储一副牌的情况下实现荷官类?

2024-02-04

  • Question

    即使只有 52 张牌,permutationIndex我在其中描述的地方说明部分,将是一个巨大的数字;它是其中之一的数字52!,需要29个字节来存储。

    Thus 我不知道一个简单的方法来计算permutationIndex一个很大的范围,并以最小的成本存储索引,或者也可以计算。我认为这个问题的解决方案将是三种算法:

    1. 计算正确的算法permutationIndex to 实施Dealing method

    2. 计算正确的算法permutationIndex to 实施Collect method

    3. 存储(或计算)的算法permutationIndex 以最小的成本

  • 说明

    我最初尝试实现一个整数句柄生成器范围从int.MinVale to int.MaxValue使用排列。

    因为范围确实很大,所以我从实现开始a Dealer有 52 张牌的类,实际上并不能存储一副牌像哈希集或数组,甚至不想随机(初始除外)。

    对于给定的序数范围,我认为完整排列之一的每个序列都有一个索引,并将其命名为permutationIndex。我使用索引来记住它是哪种排列,并且并不真正存储序列。该序列是一副牌的可能顺序之一。

    And here is an example of emulation in animated graphics to show what I thought of. Enter image description here

    每次我发牌时,我都会改变permutationIndex and dealt(发牌数),我知道哪些牌已发,哪些牌仍在手中。当我收回发出的牌时,我会知道牌号,并将其放在上面,它也成为下次发牌的牌。在动画中,colleted is the 卡号.


欲了解更多信息,如下。

  • 代码说明

    概念样本Dealer仅三个 3 的班级如下。 代码写在c# /questions/tagged/c%23,我也在考虑任何与语言无关 /questions/tagged/language-agnostic解决方案。

    以下是示例代码的一些说明

    • 用方法Dealing(),我们得到一个number视为已发牌的牌的名称。它总是返回最右边数字(与数组相关),然后通过更改将其左侧的数字(即下一个可用的)滚动到最右边的位置permutationIndex.

    • 方法Collect(int)用于收集发到的牌并将其放回牌堆中。 它会改变permutationIndex另外,根据什么number卡被退回给经销商。

    • 整数dealt告诉我们已经发了多少张牌;来自最左边到存储在的计数dealt已发牌。和permutationIndex,我们知道牌的顺序。

    • The int[,]示例代码中未使用数组,只是为了帮助想象排列。这switch语句被认为是用算法来实现的,该算法计算permutationIndex.

    • The permutationIndex与此答案中描述的内容相同
      快速排列 -> 数字 -> 排列映射算法 https://stackoverflow.com/questions/1506078/fast-permutation-number-permutation-mapping-algorithms/1506337#1506337

  • 示例代码

    public static class Dealer {
        public static void Collect(int number) {
            if(1>dealt)
                throw new IndexOutOfRangeException();
    
            switch(permutationIndex) {
                case 5:
                case 0:
                    switch(number) {
                        case 3:
                            break;
    
                        case 2:
                            permutationIndex=1;
                            break;
    
                        case 1:
                            permutationIndex=4;
                            break;
                    }
    
                    break;
    
                case 4:
                case 3:
                    switch(number) {
                        case 3:
                            permutationIndex=5;
                            break;
    
                        case 2:
                            permutationIndex=2;
                            break;
    
                        case 1:
                            break;
                    }
    
                    break;
    
                case 2:
                case 1:
                    switch(number) {
                        case 3:
                            permutationIndex=0;
                            break;
    
                        case 2:
                            break;
    
                        case 1:
                            permutationIndex=3;
                            break;
                    }
    
                    break;
            }
    
            --dealt;
        }
    
        public static int Dealing() {
            if(dealt>2)
                throw new IndexOutOfRangeException();
    
            var number=0;
    
            switch(permutationIndex) {
                case 5:
                    permutationIndex=3;
                    number=3;
                    break;
    
                case 4:
                    permutationIndex=0;
                    number=1;
                    break;
    
                case 3:
                    permutationIndex=1;
                    number=1;
                    break;
    
                case 2:
                    permutationIndex=4;
                    number=2;
                    break;
    
                case 1:
                    permutationIndex=5;
                    number=2;
                    break;
    
                case 0:
                    permutationIndex=2;
                    number=3;
                    break;
            }
    
            ++dealt;
            return number;
        }
    
        static int[,] sample=
            new[,] {
                { 1, 2, 3 }, // 0
                { 1, 3, 2 }, // 1
                { 3, 1, 2 }, // 2
                { 3, 2, 1 }, // 3
                { 2, 3, 1 }, // 4
                { 2, 1, 3 }, // 5
            };
    
        static int permutationIndex;
        static int dealt;
    }
    

不完全是您在这里想要完成的任务,但如果您想按照随机顺序处理一副牌,则可以使用洗牌算法。典型的shuffle算法是费希尔-耶茨 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle。洗牌算法将创建一个数组,以随机顺序列出卡号(13,5,7,18,22,...等)。要进行处理,您从数组中的第一个元素开始并继续向前。

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

如何在不存储一副牌的情况下实现荷官类? 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 条件类型定义

    如果我有一小段这样的代码 template
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 寻找簇的中心

    我有以下问题 进行抽象以找出关键问题 我有 10 个点 每个点与其他点有一定距离 我想要 能够找到簇的中心 即与其他点的成对距离最小的点 令 p j p k 表示点 j 和 k 之间的成对距离p i 是簇的中心点 iff p i s t m
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 节点expressJwt除非指定id路由

    我们正在使用expressJwt库 我希望能够排除GET对于以下路线api items id但不包括任何看起来像的路线api items id special action 到目前为止 我只能排除所有具有 id 下面是我们如何实现排除GET
  • 有没有办法免费获得 Borland Turbo C++ 编译器的古董版本?

    我正在寻找旧版本的 Borland Turbo C 编译器 但我必须以合法的方式得到它 有人听说过这种旧编译器有折扣吗 EDIT 我想出于教育目的公开我的旧源代码 但是它们只能在这个旧编译器上编译 我想向我的博客读者展示他们在学习新语言时应
  • 如何找到netbeans中使用的ant版本?

    我正在尝试这个教程Spring MVC Netbeans https sites google com site springmvcnetbeans step by step 我想知道 Windows 上的 netbeans 使用的是哪个版
  • D3.js v4 - 如何添加具有默认滚轮鼠标缩放行为的缩放按钮

    这个问题涵盖了与已经提出和回答的主题完全相同的主题 D3 js 如何添加具有默认滚轮缩放行为的缩放按钮 https stackoverflow com questions 25333309 d3 js how to add zoom but
  • GetObject("SAPGUI") 返回什么类型的对象?

    长话短说 如果我在初始化脚本中正确声明变量 则无法附加到 SAPFEWSELib GuiApplication 的 连接 对象 集合 MyApplication Children 0 是空的 但如果我注释掉声明块 它就可以工作 长话短说 我
  • 预构建事件后忽略 App.Config

    我有一个包含多个项目和多个开发人员的解决方案 每个开发人员都有自己的环境 当然 为了管理每个环境之间的连接字符串 我为每个环境创建了几个 app config 文件 app config dev app config qa 等 预构建事件只
  • Google Maps API v3:从数组添加标记不起作用

    首先感谢您考虑回答这个问题 非常感谢 我使用以下代码创建了一个地图 效果非常好 function initialize var mapOptions zoom 5 center new google maps LatLng 48 160 6
  • 模板不存在 Django

    我的 Django 模板位置列出为 python Lib site packages django contrib auth templates 在我看来我有 return render to response hello html nam
  • 通过代码 tradeview/pine 脚本隐藏图表、数量和信号标签上的交易

    每次我更新策略代码时 样式都会重置 这意味着 图表上的交易 信号标签 Quantity 被重置为显示 有没有办法覆盖该行为 以便我可以隐藏 图表上的交易 非常感谢您对这个看似微不足道的问题的帮助 不 默认情况下没有禁用它们的功能 前段时间我
  • MySQL 索引上的正则表达式

    我有查询在 where 子句中有多个正则表达式 where 子句中包含的列已被索引 但查询没有使用索引 MySql 正则表达式是否会导致使用索引 如果没有 解决方法是什么 不可以 正则表达式查找不能使用索引 如果您应用正则表达式的对象是索引
  • vectorize_sequences 的标准实现

    In 弗朗索瓦 肖莱 https fchollet com s 使用 Python 进行深度学习 https www manning com books deep learning with python 出现这个函数 def vector
  • 如何从类库中读取“System.ServiceModel”配置节组?

    有没有办法访问 System ServiceModel 客户端配置 即基于类 dll 项目中的app config ConfigurationManager GetSection string 允许您从执行应用程序的 app config
  • 空格键:如何在 if 语句中使用 and/or

    我有以下代码 div class div 如何在空格键模板的 if 条件中使用 AND OR 空格键无法处理逻辑表达式 因此您需要创建一个助手来为您处理计算 其实你可以实现and具有嵌套 if 的功能如下 if condition1 if
  • 如何在 Wix 安装程序中添加 url [LINK]

    我正在使用 Wix 工具集版本 3 7 我想在欢迎屏幕描述中添加一些指向产品网站的链接 如何实现这一目标 我认为你可以通过做这样的事情来做到这一点
  • 在交叉编译时我必须对 C++ 库做什么?

    这是我的配置的编译器部分 IF UNIX Compiler flags specify the cross compiler SET CMAKE C COMPILER home username projects buildroot out
  • 使用 fxml 文件设置anchorPane的内容

    我使用手风琴控件 根据标题窗格 我需要将 fxml 文件加载到锚窗格中 所以我有两部分 一部分用于手风琴 另一部分用于anchorPane 根据点击显示内容 FXML private StackPane tmpPane FXML priva
  • Gradle dagger lint:按包忽略

    我使用 Gradle 创建了一个 Android 项目 我添加了一个 Dagger 库 dependencies compile com squareup dagger dagger compiler 1 2 1 compile com s
  • 如何将react数据发布到express

    我正在尝试创建一个图书应用程序 我在前端做出反应 在后端使用节点js 当我尝试在后端创建时 它说无法 POST create 我该怎么办 该文件夹分为前端和后端 我正在使用 axios 我是 React js 的新手 请帮忙 我如何将 Re
  • 最高效的 CSS 选择器:标题标签、类还是 ID? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在不存储一副牌的情况下实现荷官类?

    Question 即使只有 52 张牌 permutationIndex我在其中描述的地方说明部分 将是一个巨大的数字 它是其中之一的数字52 需要29个字节来存储 Thus 我不知道一个简单的方法来计算permutationIndex一个