生成无连续重复的随机枚举

Generate random enum without consecutive repetition

本文关键字:随机 枚举 连续      更新时间:2023-10-16

如何在不连续重复的情况下生成随机枚举值?

enum keycode {
    VK_LEFT   = 75,
    VK_UP     = 72,
    VK_RIGHT  = 77,
    VK_DOWN   = 80
};

VK_LEFT、VK_DOWN、VK_UP、VK_RIGHT、VK-DOWN。。。

而不是

VK_LEFT、VK_DOWN、VK_UPVK_UP、VK_RIGHT。。。

假设您的四个值是0、1、2和3。

在{0,1,2,3}中选取一个随机数N0
在{0,1,2,3}\{N0}中选取一个随机数N1
在{0,1,2,3}\{N1}中选取一个随机数N2
在{0,1,2,3}\{N2}中选取一个随机数N3
等等…

当您调用从enum生成随机值的代码时,让它根据上次选择的值检查新的随机值。如果它们相等,请选择另一个值。

这可以在while循环中完成。伪码:

keycode value;
while (value != lastChosen)
    value = keycode[random.next];
lastChosen = value;

其中CCD_ 2是最后选择的值。

这将生成介于1和N:之间的K个非重复数

vector<int> non_repeat(int K, int N)
{
    vector<int> res;
    int last = 1 + rand() % N;
    res.push_back(last);
    for(int i=1;i<K;++i)
    {
        int r = 1 + rand() % (N-1);
        if(r>=last) ++r;
        res.push_back(r);
        last = r;
    }
    return res;
}

应该很容易根据您的需要采用