gpt4 book ai didi

c++ - 如何产生不产生超过 X 个连续元素的随机数序列

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:48 26 4
gpt4 key购买 nike

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

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

我需要一种生成 6 个随机数的算法,其中它可能不会在该序列中生成超过 2 个连续的数字。

示例:3 3 4 4 2 1

^很好。

示例:3 3 3 4 4 2

^不! 不!错了!

显然,我不知道如何在不经常绊倒自己的情况下做到这一点。

是否有可以执行此操作的 STL 或 Boost 功能?或者也许这里有人知道如何为其编写算法。那太棒了。

我正在尝试做的和我已经尝试过的。(您可以跳过的部分)

这是在 C++ 中。我正在尝试制作一个 Panel de Pon/Tetris Attack/Puzzle League 来练习任何克隆。游戏有 6 个方 block 行,3 个或更多匹配方 block 将破坏方 block 。 Here's a video in case you're not familiar.

当一个新行从底部出来时,它不能出现 3 个水平匹配 block ,否则它会自动消失。我不想要水平的东西。垂直虽然没问题。

我已经尽力做到这一点,但似乎做不对。当我开始游戏时, block block 丢失了,因为它在不应该检测到匹配项时检测到了匹配项。如您所见,我的方法很可能过于笨拙和复杂。

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);
}
}

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

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

然后我使用 RowCheck 函数查看一行中是否有 3 个连续的 blockTypes,我对所有 block 类型都这样做了。 *_match 变量是具有相同 block 类型的 3 个 block 对象的数组。如果我确实发现有 3 个连续的 block 类型,我只需简单地将第一个值减去一个。但是,如果我这样做,我可能会无意中产生另外 3 个匹配项,所以我只是确保 block 类型按从大到小的顺序排列。

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

最佳答案

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

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

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;
}

关于c++ - 如何产生不产生超过 X 个连续元素的随机数序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6545372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com