如何生成不生成超过 X 个连续元素的随机数序列

2024-01-28

好吧,我真的不知道如何正确地提出这个问题,因为我几乎不知道如何用一句话来描述我想要的东西,我很抱歉。

让我开门见山,你可以跳过剩下的,因为我只是想表明我已经尝试过一些东西,而不是来这里一时兴起问问题。

我需要一个生成 6 个随机数的算法,但在该序列中生成的连续数字不得超过 2 个。

示例:3 3 4 4 2 1

^FINE.

示例:3 3 3 4 4 2

^NO! NO! WRONG!

显然,我不知道如何做到这一点而不不断地绊倒自己。

是否有 STL 或 Boost 功能可以做到这一点?或者也许这里有人知道如何为其设计一个算法。那将是真棒。

我正在尝试做什么以及我已经尝试过什么。(可以跳过的部分)

这是在 C++ 中。我正在尝试制作一个 Panel de Pon/Tetris Attack/Puzzle League 克隆来进行练习。游戏有 6 个方块行,3 个或更多匹配的方块将摧毁方块。

当新的一行从底部出现时,它不能出现 3 个水平匹配的块,否则它会自动消失。我不想要水平的东西。不过垂直也还好。

我试图做到这一点,但似乎我无法做到这一点。当我开始游戏时,大块的方块丢失了,因为它检测到了不应该匹配的匹配。正如您所看到的,我的方法很可能是严厉且过于复杂的。

enum BlockType {EMPTY, STAR, UP_TRIANGLE, DOWN_TRIANGLE, CIRCLE, HEART, DIAMOND};
vector<Block> BlockField::ConstructRow()
{
    vector<Block> row;

    int type = (rand() % 6)+1;

    for (int i=0;i<6;i++)
    {
        row.push_back(Block(type));
        type = (rand() % 6) +1;
    }

    // must be in order from last to first of the enumeration
    RowCheck(row, diamond_match);
    RowCheck(row, heart_match);
    RowCheck(row, circle_match);
    RowCheck(row, downtriangle_match);
    RowCheck(row, uptriangle_match);
    RowCheck(row, star_match);

    return row;
}

void BlockField::RowCheck(vector<Block> &row, Block blockCheckArray[3])
{
    vector<Block>::iterator block1 = row.begin();
    vector<Block>::iterator block2 = row.begin()+1;
    vector<Block>::iterator block3 = row.begin()+2;
    vector<Block>::iterator block4 = row.begin()+3;
    vector<Block>::iterator block5 = row.begin()+4;
    vector<Block>::iterator block6 = row.begin()+5;

    int bt1 = (*block1).BlockType();
    int bt2 = (*block2).BlockType();
    int bt3 = (*block3).BlockType();
    int bt4 = (*block4).BlockType();
    int type = 0;

    if (equal(block1, block4, blockCheckArray)) 
    {
        type = bt1 - 1;
        if (type <= 0) type = 6;
        (*block1).AssignBlockType(type);
    }
    else if (equal(block2, block5, blockCheckArray)) 
    {
        type = bt2 - 1;
        if (type <= 0) type = 6;
        (*block2).AssignBlockType(type);
    }
    else if (equal(block3, block6, blockCheckArray)) 
    {
        type = bt3 - 1;
        if (type == bt3) type--;
        if (type <= 0) type = 6;
        (*block3).AssignBlockType(type);
    }
    else if (equal(block4, row.end(), blockCheckArray)) 
    {
        type = bt4 - 1;
        if (type == bt3) type--;
        if (type <= 0) type = 6;

        (*block4).AssignBlockType(type);
    }
}

Sigh,我不确定它是否有助于展示这一点......至少它表明我已经尝试过一些东西。

基本上,我通过将 BlockType 枚举描述的随机块类型分配给 Block 对象的构造函数(Block 对象具有 blockType 和位置)来构造行。

然后,我使用 RowCheck 函数来查看一行中是否有 3 个连续的块类型,并且我对所有块类型都执行了此操作。 *_match 变量是具有相同块类型的 3 个块对象的数组。如果我确实发现有 3 个连续的块类型,我只需将第一个值减 1 即可。然而,如果我这样做,我可能会无意中产生另外 3 个匹配,所以我只是确保块类型按从最大到最小的顺序排列。

好吧,它很蹩脚,很复杂,而且不起作用!这就是为什么我需要你的帮助。


记录前两个值就足够了,并在新生成的值与前两个值匹配时循环。

对于任意的运行长度,动态调整历史缓冲区的大小并在循环中进行比较是有意义的。但这应该接近满足您的要求。

int type, type_old, type_older;

type_older = (rand() % 6)+1;
row.push_back(Block(type_older));

type_old = (rand() % 6)+1;
row.push_back(Block(type_old));

for (int i=2; i<6; i++)
{
    type = (rand() % 6) +1;
    while ((type == type_old) && (type == type_older)) {
        type = (rand() % 6) +1;
    }

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

如何生成不生成超过 X 个连续元素的随机数序列 的相关文章

随机推荐

  • Mono .EXE 程序集集资源管理器图标

    在Linux上使用gmcs编译时 如何设置最终EXE将使用的资源管理器图标 我有一个 ico 文件要附加到输出 exe 答案必须是可自动化构建并在 Linux 上执行 无需 wine 构建机器架构不是 x86 可以使用针对 Windows
  • 将 XML 值反序列化为枚举时处理额外空格

    我一直想知道是否可以做到这一点 当 XML 响应有不正确的值需要映射到枚举时 这将是一个很大的帮助 我具体处理的情况是当期望值有尾随空格而枚举期望它没有尾随空格时 XML
  • Android 编程中 b/w app:theme 和 android:theme 有什么区别

    我看到有人写这个 app theme style xyz 另一方面 有些人写 android theme style xyz 这2个代码有什么区别 app and android实际上是命名空间 你可以用同样的方式来思考它们packages
  • IdHTTP 如何发送原始正文

    我如何使用IdHTTP发送消息为PostMan下面的dos 我的第一次尝试如下 function TIdFoo SendIM const AID AMessage string Boolean const URL https URL com
  • SOM(自组织映射)和 K 均值有什么区别?

    stackoverflow中只有一个与此相关的问题 更多的是关于哪个更好 我只是不太明白其中的区别 我的意思是它们都使用向量 这些向量被随机分配给集群 它们都使用不同集群的质心来确定获胜的输出节点 我的意思是 差异到底在哪里 在 K 均值中
  • 如何正确验证验证码?

    我有使用验证码验证的登录表单 我在 php 文件中编写验证时遇到问题 如果验证码输入不正确 则会出现错误 目前我已经验证 如果没有输入验证码 它会显示错误 但是当我输入一些错误的验证码时 登录将继续并将用户登录到站点 这是我的代码 感谢任何
  • Maven 依赖范围未按预期工作

    Maven 2 2 1 声称支持版本范围 参见例如http www sonatype com books mvnref book reference pom relationships sect project dependency htm
  • Google Contacts API - 无法刷新访问令牌

    我们将 Google Contacts API 与 OAuth2 结合使用 credential new GoogleCredential Builder setTransport new NetHttpTransport setJsonF
  • 如何将本地托管的MySQL数据库与docker容器连接

    Through docker compose yml我能够运行该应用程序 现在我们想要将应用程序转移到生产环境 但我们不想使用容器数据库 那么有什么方法可以让我可以使用以下命令将本地 MySQL 数据库与应用程序连接起来docker com
  • Laravel maatwebsite/excel Composer 在 mac 中安装错误

    尝试通过 Mac 版 Composer 在 XAMPP 7 1 32 rev 1 中安装 maatwebsite excel 如何在 XAMPP for mac 中启用这些扩展或者是否存在任何其他问题 请帮我 composer instal
  • 写重的elasticsearch

    我正在使用 kafka storm 和 Elasticsearch 编写一个实时分析工具 并且想要一个针对大约 50K 秒插入进行写入优化的 Elasticsearch 出于 POC 的目的 我尝试将批量文档插入到 Elasticsearc
  • magento管理部分添加类别时出现致命错误

    我在 Magento 管理部分遇到一个错误 当我尝试创建一个类别时 它显示以下致命错误 致命错误 在第 331 行对 C wamp www magento lib Varien Data Tree Dbp php 中的非对象调用成员函数 g
  • 我如何使用 jQuery 来解析 XML,就像我在这里一样

    这个 或其某些变体 是由我的 PHP 脚本输出的 请注意 某些标签在不同的上下文中使用相同的名称
  • 输入文本并保存到文件

    以下函数创建一个新的文本文件并允许用户输入要保存到文件中的文本 我遇到麻烦的主要问题是 1 允许单词之间有空格 2 按 Enter 保存文本 而不是转到新行 void new file void char c 10000 char file
  • 刷新令牌后,Azure AD B2C 访问令牌声明不会更新

    我们在应用程序中使用 Azure AD B2C 我们授权用户使用API https tenant b2clogin com tenant onmicrosoft com policy oauth2 v2 0 authorize client
  • Drupal 迁移 - 现在只有首页可以使用

    我刚刚从 ISP 迁移了 Drupal 站点 到专用的 Linux CentOS 服务器 MySQL 数据库已配置并生成首页 没有错误 问题是只有主页可以使用 所有其他页面均显示 404 页面未找到错误 所以 mysite com 可以工作
  • 具有不同布局的 Rails 邮件程序

    我在通知程序模型中对所有电子邮件 20 多封电子邮件 使用一种布局 但是有时我只想发送一封纯文本电子邮件 根本没有布局或 html 我似乎无法弄清楚如何 如果我尝试发送纯文本电子邮件 我仍然可以获得布局以及电子邮件中的所有 HTML 我正在
  • 有人知道从头开始创建增强现实应用程序或使用开源框架的好教程吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找涵盖创建 AR 应用程序每一步的优秀教程 如果它还涵盖光学等背后的一些理论 那将是有益的 一个好的设置是使用AR工具包 http
  • php header 立即定位?

    为什么 Location 标头没有立即重定向页面 它总是在重定向之前执行整个过程 我举一些例子 header Location http www php net f fopen demo txt w fwrite f Test fclose
  • 如何生成不生成超过 X 个连续元素的随机数序列

    好吧 我真的不知道如何正确地提出这个问题 因为我几乎不知道如何用一句话来描述我想要的东西 我很抱歉 让我开门见山 你可以跳过剩下的 因为我只是想表明我已经尝试过一些东西 而不是来这里一时兴起问问题 我需要一个生成 6 个随机数的算法 但在该