生成随机枚举而不连续重复

时间:2015-04-07 14:35:03

标签: c++ random

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

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_UP VK_UP ,VK_RIGHT ......

3 个答案:

答案 0 :(得分:0)

让我们说你的四个值是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 等等...

答案 1 :(得分:0)

当您调用从enum生成随机值的代码时,请根据所选的最后一个值检查新的随机值。如果它们相等,请选择其他值。

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

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

其中lastChosen是最后选择的值。

答案 2 :(得分:0)

这将生成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;
}
根据您的需要

应该相当容易